powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Перевести: SQL to LINQ
5 сообщений из 5, страница 1 из 1
Перевести: SQL to LINQ
    #38973635
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 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
Перевести: SQL to LINQ
    #38973849
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перевести: SQL to LINQ
    #38974024
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перевести: SQL to LINQ
    #38974273
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перевести: SQL to LINQ
    #38974330
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikпо идее, в классе Question должно быть навигационное свойство Responses.
Я прошу прощения, но ...
Таблица Response связана с таблицей Question , а не наоборот. Соответственно класс Question НЕ должен содержать "навигационное свойство Responses".
Или я что-то не понимаю ...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Перевести: SQL to LINQ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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