【发布时间】:2020-02-12 15:58:32
【问题描述】:
假设我有以下 EF6 Linq 语句,它计算 2 个表的项目数(表 1 有 10 个项目,表 2 没有项目):
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 语句的背景,我将以下 TSQL 语句转换为 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 语句在一次数据库行程中运行而不是多次运行也非常重要。
【问题讨论】:
-
为什么不只做简单的计数?即
db.Table1.Count()和db.Table2.Count(),然后担心捆绑?这似乎更有可能给您想要的结果;实际上,任何超过零行的分组都是零组,即使分组是“所有行”分组 -
你为什么使用联合?好像你可以做这样的事情:
var r = new[] { new { Name = "Table1", EntryCount = db.Table1.Count() }, new { Name = "Table2", EntryCount = db.Table2.Count() } }; -
我正在尝试提出与我粘贴的 TSQL 语句等效的 linq。
-
@MarcGravell,我希望 linq 查询一次从数据库中获取结果并替换我粘贴的 TSQL 函数。如果这在单个 linq 查询中是不可能的,那么我将使用本机 sql 函数。
-
如果在 Table2 的
Select之前添加DefaultIfEmpty()会怎样?
标签: c# entity-framework linq linq-to-sql linq-to-entities