C# 一次数据库访问中多个表上聚合函数的Linq等价物
我有一个table函数,它返回表名和该表中的条目数:C# 一次数据库访问中多个表上聚合函数的Linq等价物,c#,entity-framework,linq,tsql,C#,Entity Framework,Linq,Tsql,我有一个table函数,它返回表名和该表中的条目数: CREATE FUNCTION [dbo].[ufnGetLookups] () RETURNS @lookupsWithItemCounts TABLE ( [Name] VARCHAR(100), [EntryCount] INT ) AS BEGIN INSERT INTO @lookupsWithItemCounts([Name],[EntryCount]) VALUES
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 Table))
RETURN;
END
上述简单函数的Linq等价物是什么?请注意,我希望在一次拍摄中获得结果,操作的速度对我来说非常重要。如果我意识到转换后的linq-to-sql会产生一个庞大的sql,性能会受到影响,那么我宁愿坚持使用现有的用户定义函数,而忘记linq等效函数。您可以通过联合查询来实现这一点。乙二醇
var q = db.Books.GroupBy(g => "Books").Select(g => new { Name = g.Key, EntryCount = g.Count() })
.Union(db.Authors.GroupBy(g => "Authors").Select(g => new { Name = g.Key, EntryCount = g.Count() }));
var r = q.ToList();
不是EF的人,也不确定这是否会更有效
Select TableName = o.name
,RowCnt = sum(p.Rows)
From sys.objects as o
Join sys.partitions as p on o.object_id = p.object_id
Where o.type = 'U'
and o.is_ms_shipped = 0x0
and index_id < 2 -- 0:Heap, 1:Clustered
--and o.name in ('Table1','Table2','Table3' ) -- Include (or not) your own filter
Group By o.schema_id,o.name
注意:希望我能回忆起它的来源,但我已经在我的发现过程中使用了它。一个问题:您在什么上下文中运行linq语句?若你们想要像上面那个样的硬核语句,为什么还要费心在linq中编写它,而不是使用好的老SqlCommand运行本机sql语句呢?@MHOOS我不会在linq中编写它。我喜欢让代码尽可能靠近数据库。这意味着接触点和/或故障点很少。在您的声明中,如果没有书籍,它将不会出现在最终列表中。当特定表[例如Books]中的项数为零时,如何将linq语句更改为返回0而不是空行?我不知道在linq查询中有什么合理的方法可以实现这一点,所以我只想将项数添加到列表中。