Допустим, у меня есть следующий оператор EF6 Linq, который подсчитывает количество элементов для 2 таблиц (в Table1 есть 10 элементов, а в Table2 нет элементов):
var q = db.Table1.GroupBy(g => "Table1").Select(g => new { Name = g.Key, EntryCount = g.Count() })
.Union(db.Table2.GroupBy(g => "Table2").Select(g => new { Name = g.Key, EntryCount = g.Count() }));
var r = q.ToList();
Ожидаемый результат должен быть примерно таким:
Name | EntryCount
---------------------
Table1 | 10
Table2 | 0
Однако, поскольку в Table2 нет элементов, он не появляется в конечном результате, и я получаю следующее:
Name | EntryCount
---------------------
Table1 | 10
Как я могу убедиться, что Таблица 2 всегда отображается в окончательный список, даже если он пустой и не имеет записей?
Чтобы дать вам представление о том, почему я делаю этот оператор Linq, я преобразовываю следующий оператор T SQL в запрос linq:
CREATE FUNCTION [dbo].[ufnGetLookups] ()
RETURNS
@lookupsWithItemCounts TABLE
(
[Name] VARCHAR(100),
[EntryCount] INT
)
AS
BEGIN
INSERT INTO @lookupsWithItemCounts([Name],[EntryCount])
VALUES
('Table1', (SELECT COUNT(*) FROM Table1)),
('Table2', (SELECT COUNT(*) FROM Table2)),
('Table3', (SELECT COUNT(*) FROM Table3))
RETURN;
END
Также очень важно, чтобы этот оператор linq выполнялся в одной поездке базы данных, а не в нескольких.