Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一次数据库访问中多个表上聚合函数的Linq等价物_C#_Entity Framework_Linq_Tsql - Fatal编程技术网

C# 一次数据库访问中多个表上聚合函数的Linq等价物

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

我有一个table函数,它返回表名和该表中的条目数:

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查询中有什么合理的方法可以实现这一点,所以我只想将项数添加到列表中。