根据不同的多个列集从表中选择多个列

时间:2018-04-23 21:41:46

标签: c# .net postgresql linq entity-framework-6

我正试图从C#

中的LINQ / EF6获取这样的查询
SELECT "ID_column" 
FROM "Entity" 
WHERE ("ColumnA","ColumnB") IN (('Value_0_0','Value_0_1'),('Value_1_0','Value_1_1'), ...);

但我收到以下错误代码

  

无法创建“匿名类型”类型的常量值。在此上下文中仅支持原始类型或枚举类型。

context.Entities
       .Where(e => values.Any(v => v.ColumnA == e.ColumnA && v.ColumnB == e.ColumnB))
       .Select(e => e.ID_column);

context.Entities
       .Where(e => values.Contains(new {e.ColumnA, e.ColumnB}))
       .Select(e => e.ID_column);

有没有办法如何在一个使用LINQ的查询中基于同一个表中不同的多列列从表中选择多个列?

我知道有很多与我得到的错误有关的问题,但我没有发现任何与多列相关或如何解决这个问题。

2 个答案:

答案 0 :(得分:0)

EF似乎不能像这样创建IN查询。 您可以使用LinqKit,或直接构建表达式,以便动态构建谓词。此示例构建一个填充了AND / OR和null检查的大量SQL语句,但它将在SQL服务器上运行,而不是在应用程序端运行。

var predicate = LinqKit.PredicateBuilder.New<Entity>();
foreach(var v in values) {
  predicate.Or(e => v.ColumnA == e.ColumnA && v.ColumnB == e.ColumnB);
}
context.Entities
   .Where(predicate)
   .Select(e => e.ID_column);

请记住 - 即使使用IN查询,您也必须将所有条件移至服务器,因此情况并非如此糟糕。

答案 1 :(得分:0)

似乎没有一个好的解决方案,但最好的选择可能是双重过滤 - 一次在服务器上,一次在客户端上:

context.Entities
       .Where(e => values.Select(v => v.ColumnA).Contains(e.ColumnA) && values.Select(v => v.ColumnB).Contains(e.ColumnB))
       .AsEnumerable()
       .Where(e => values.Contains(new { e.ColumnA, e.ColumnB }))
       .Select(e => e.ID_column);
相关问题