Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.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/4/c/55.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# 要在SQL server上聚合的LINQ自定义或运算符_C#_Sql Server_Linq_Entity Framework - Fatal编程技术网

C# 要在SQL server上聚合的LINQ自定义或运算符

C# 要在SQL server上聚合的LINQ自定义或运算符,c#,sql-server,linq,entity-framework,C#,Sql Server,Linq,Entity Framework,我想在我的ints上使用OR运算符。我可以用这样的东西 new int[] { 1, 1, 2, 2, 4, 8, 24, 32, 56 }.Aggregate((a,b) => a | b) 等于63。然而,我不能做像这样的事情 db.numbers.Select(a => a.number).Aggregate((a,b) => a | b) 它抛出以下异常: NotSupportedException:LINQ to Entities无法识别方法“Int32聚合[In

我想在我的ints上使用OR运算符。我可以用这样的东西

new int[] { 1, 1, 2, 2, 4, 8, 24, 32, 56 }.Aggregate((a,b) => a | b)
等于63。然而,我不能做像这样的事情

db.numbers.Select(a => a.number).Aggregate((a,b) => a | b)
它抛出以下异常:

NotSupportedException:LINQ to Entities无法识别方法“Int32聚合[Int32](System.Collections.Generic.IEnumerable
1[System.Int32],System.Func
3[System.Int32,System.Int32,System.Int32]),并且无法将此方法转换为存储表达式````

我认为这是因为它不知道sql server中的哪个函数实现了
a | b
。我也不知道


有没有办法在不在本地聚合的情况下在上实现它

Aggregate
不受linq to实体的支持(无论传递什么函数)。请记住,SQL是基于集合的,因此自定义聚合通常很难转换为SQL

您可以在SQL之外进行聚合:

db.numbers.Select(a => a.number)
          .AsEnumerable()  // shift from EF to Linq-to-Objects
          .Aggregate((a,b) => a | b)

主要区别在于,整个数据集将被拉入内存,而不是聚合的结果。如果您能找到一种在SQL中进行聚合的方法(我想不出一种),那么您只需执行SQL语句而不是Linq查询,可能会有更好的性能。

不支持的不是
|
,而是
聚合
。在LINQ到Entites中,您可以看到支持和不支持的LINQ方法的列表:另一个要考虑的选项是编写自定义.NET聚合函数,并将该DLL导入SQLServer本身。我已经做了很多这样的事情,而且效果很好。虽然我不知道如何从LINQ调用它,但是如果目标是在SQL方面做繁重的操作,那么它是值得探索的。@ JojPiggAgARARDO在挖掘MySQL时做了类似的事情,它只是一个用C++编写的SQL函数。但在本例中,我必须告诉Linq有一个名为“mycustomor”的函数,最难判断的是它是一个聚合函数。但这是一个很好的例子,当事情变得复杂时,我会尝试一下。谢谢我熟悉AsEnumerable或ToList,但是在某些情况下它在子查询中不起作用,例如
db.table.Select(a=>db.anothertable.Select(b=>b.number).AsEnumerable().Aggregate((a,b=>a | b))
,除非您不将AsEnumerable应用于db.table,如果您有很多连接(我有连接),这可能会很痛苦。从那以后,我会接受这个答案,因为我在帖子中提到了“不在本地聚合它”(对于我前面提到的案例)。谢谢