[C#]LINQ 自定义 OR 运算符在 SQL server 上的聚合

发布时间: 2017/2/27 1:07:39
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想在我的 int 上使用 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 到实体不能识别的方法 ' Int32 聚合 [Int32] (如 1[System.Int32], System.Func 3[System.Int32,System.Int32,System.Int32])' 方法和这种方法不能转化为一个存储表达式.' '

我想是因为它不知道什么功能在 sql 服务器实现 a | b 。我不太知道它。

有任何办法执行这上没有本地聚合它吗?

解决方法 1:

Aggregate不支持 linq 实体 (无论什么函数中传递)。 请记住,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 查询。

官方微信
官方QQ群
31647020