Преобразование SQL в Linq, возвращающее значение по умолчанию в подзапросе - PullRequest
0 голосов
/ 05 января 2019

У меня есть система тикетов, в которой я пытаюсь получить основную информацию о последней добавленной заметке о тикете, основываясь на том, какие тикеты еще открыты.

Вот сводные таблицы, включая дополнительные столбцы, которые я не запрашиваю:

Билетный стол

TicketId
CustomerId
DateIn
CallNature
OpenClosed

Таблица TicketDetails

TicketDetailsId
TicketId
TicketNote
DateLogged

Вот запрос SQL:

SELECT
    t.TicketId,
    t.CustomerId,
    t.DateIn,
    (SELECT TOP 1 td.DateLogged 
     FROM TicketDetails td 
     WHERE td.TicketId = t.TicketId 
     ORDER BY td.DateLogged DESC) DateLogged
FROM 
    Tickets t
WHERE 
    t.OpenClosed = 1

Вот мой текущий запрос Linq:

var result = from t in ef.Tickets
  where t.OpenClosed == true
  select new
  {
    TicketId = t.TicketId,
    CustomerId = t.CustomerId,
    DateIn = t.DateIn,
    DateLogged = (from td in ef.TicketDetails
                   where td.TicketId == t.TicketId
                   orderby td.DateLogged descending
                   select td.DateLogged).Take(1)
  };

Вот пример результата запроса Linq:

TicketId = 11000
CustomerId = 4622
DateIn = 2018-01-25T00:00:00
DateLogged = 0001-01-01T00:00:00

должно быть:

TicketId = 11000
CustomerId = 4622
DateIn = 2018-01-25T00:00:00
DateLogged = 2018-12-12T13:32:42

У меня нет всех полей в примере, но они не имеют отношения к вопросу.

Когда я запускаю SQL-запрос, результаты ожидаются. Когда я запускаю запрос Linq, все поля заполняются, кроме DateLogged, он продолжает возвращать значение по умолчанию (0001-01-01).

Я подтвердил, что на каждый Билет есть хотя бы 1 TicketDetail для возврата.

1 Ответ

0 голосов
/ 05 января 2019

Окончательное решение благодаря ссылке Нейла на отложенное выполнение:

var result = (from t in ef.Tickets
where t.OpenClosed == true
select new {
  TicketId = t.TicketId,
  CustomerId = t.CustomerId,
  DateIn = t.DateIn,
  DateLogged = (from td in ef.TicketDetails
                where td.TicketId == t.TicketId
                orderby td.DateLogged descending
                select td.DateLogged).Take(1).FirstOrDefault()
}).ToList();

И ссылка на пост, объясняющий разницу между выполнением запросов Linq.

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/query-execution

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...