Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Перевести: SQL to LINQ / 5 сообщений из 5, страница 1 из 1
01.06.2015, 17:45
    #38973635
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести: SQL to LINQ
Есть 2-е связанные таблицы: Вопрос(Question) - Ответ(Response) по полю QuestionID
И вот этот SQL-запрос, в котором надо вернуть 10 записей начиная с 50:
(выводит поля таблицы Вопроса и количество ответов)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT 
 TOP 10 
 Question.QuestionID, Question.QuestionDate, Question.QuestionType, Question.QuestionName, Question.QuestionEMail, Question.QuestionMsg,
 COUNT(Response.ResponseID) AS ResponseCounts
FROM Question
LEFT JOIN Response AS Response ON Response.QuestionID=Question.QuestionID
WHERE 
 (
  Question.QuestionID NOT IN 
   (
    SELECT TOP 60 QuestionID FROMQuestion ORDER BY QuestionID DESC
   )
  ) 
GROUP BY Question.QuestionID, Question.QuestionDate, Question.QuestionType, Question.QuestionName, Question.QuestionEMail, Question.QuestionMsg
ORDER BY Question.QuestionDate DESC



Надо перевести на Линк, может кто подскажет как это сделать?
...
Рейтинг: 0 / 0
01.06.2015, 23:20
    #38973849
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести: SQL to LINQ
potkin,

в первом приближении это выглядит примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
var query = Questions
    .OrderByDescending(q => q.QuestionID)
    .Skip(50)    
    .OrderByDescending(q => q.QuestionDate)
    .Select(q => new { q.QuestionID, q.QuestionDate, q.QuestionType, q.QuestionName, q.QuestionEMail, q.QuestionMsg, ResponseCounts = q.Responses.Count })
    .Take(10);



Насколько я понимаю, GroupBy в данном случае не нужен.

Можно выбросить Select, при этом в результирующей коллекции будет тип Question (со всеми полями), а количество респонзов можно будет получать из свойства Responses.Count (только на каждый будет посылаться отдельный запрос в БД).
...
Рейтинг: 0 / 0
02.06.2015, 10:14
    #38974024
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести: SQL to LINQ
petalvik ResponseCounts = q.Responses.Count
У меня таблица Response содержит FK на таблицу Question
Модели:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
    //Вопрос
    public class Question
    {
        [Key]
        public int QuestionID { get; set; }
        public DateTime?QuestionDate { get; set; }
        [Required]
        public string QuestionName { get; set; }
        [Required]
        public string QuestionEMail { get; set; }
        [Required]
        public string QuestionMsg { get; set; }
    }

    //Ответ
    public class Response
    {
        [Key]
        public int ResponseID { get; set; }

        //metanit.com/sharp/entityframework/6.3.php
        public int QuestionID { get; set; }
        [ForeignKey(QuestionID")]
        public virtual Question FKQuestion { get; set; }

        public DateTime? ResponseDate { get; set; }
        [Required]
        public string ResponseName { get; set; }
        [Required]
        public string ResponseEMail { get; set; }
        [Required]
        public string ResponseMsg { get; set; }
    }
...
Рейтинг: 0 / 0
02.06.2015, 13:29
    #38974273
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести: SQL to LINQ
potkin,

по идее, в классе Question должно быть навигационное свойство Responses.

Я, думая над ответом, набросал в LinqPad'е таблицы database first:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table Question (
    QuestionID    int primary key, 
    QuestionDate  date,
    QuestionType  int,
    QuestionName  varchar(100),
    QuestionEMail varchar(100),
    QuestionMsg   varchar(100)
)
create table Response (
    ResponseID int primary key,
    QuestionID int references Question(QuestionID),
    Foo        varchar(100)
)

(Имена таблиц в единственном числе в коде C# переводятся во множественное)
При этом упомянутое свойство было создано автоматически.

Если такого свойства нет, его стоит создать. Запросы станет делать намного проще.
Потому что без него я сейчас попробовал, но с ходу не вышло, забуксовал. Нужно делать Join, потом Group, чтобы использовать Count...
...
Рейтинг: 0 / 0
02.06.2015, 14:31
    #38974330
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести: SQL to LINQ
petalvikпо идее, в классе Question должно быть навигационное свойство Responses.
Я прошу прощения, но ...
Таблица Response связана с таблицей Question , а не наоборот. Соответственно класс Question НЕ должен содержать "навигационное свойство Responses".
Или я что-то не понимаю ...
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Перевести: SQL to LINQ / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]