Как написать LINQ для LEFT JOIN таблицы, которая является GROUP BY? - PullRequest
1 голос
/ 09 мая 2020

У меня есть SQL запрос к серверу:

SELECT *
FROM ENotes en LEFT JOIN (
    SELECT ENoteId, ReadByUId, [Read]
    FROM [ENotesReadBies]
    WHERE ReadByUId = 1173 AND [Read] = 1
    GROUP BY ENoteId, ReadByUId, [Read]
) A ON (en.ENoteId = A.ENoteId)

Как написать для него LINQ? Я знаю, что могу оставить соединение следующим образом:

from x in _context.ENotes
join erb in _context.ENotesReadBies on x.ENoteId equals erb.ENoteId
into tempReadBy
from rb in tempReadBy.Where(x => x.ReadByUId == 1173 && x.Read == true).DefaultIfEmpty()

Но у этого нет GROUP BY.

Спасибо

1 Ответ

1 голос
/ 09 мая 2020

Давайте сделаем это следующим образом:

var groupPart = from erb in _context.ENotesReadBies
            where erb.ReadByUId == 1173 && erb.Read
            group erb by new { erb.ENoteId, erb.ReadByUId, erb.Read } into grouped
            select new
            {
                grouped.Key.ENoteId,
                grouped.Key.ReadByUId,
                grouped.Key.Read
            };

var result = from e in _context.ENotes
            join g in groupPart
            on e.ENoteId equals g.ENoteId into gJ
            from g in gJ.DefaultIfEmpty()
            select new
            {
                ENote = e,
                g.ENoteId,
                g.ReadByUId,
                g.Read
            };

var materializedResult = result.ToList();

Если вы запустите этот код и профилируете его сгенерированный запрос sql, вы получите:

SELECT [e].[ENoteId], [e].[Name], [t].[ENoteId], [t].[ReadByUId], [t].[Read]
FROM [ENotes] AS [e]
LEFT JOIN (
    SELECT [e0].[ENoteId], [e0].[ReadByUId], [e0].[Read]
    FROM [ENotesReadBies] AS [e0]
    WHERE ([e0].[ReadByUId] = CAST(1173 AS bigint)) AND ([e0].[Read] = CAST(1 AS bit))
    GROUP BY [e0].[ENoteId], [e0].[ReadByUId], [e0].[Read]
) AS [t] ON [e].[ENoteId] = [t].[ENoteId]

это то же самое, что вы хотите;)

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