我正试图从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的查询中基于同一个表中不同的多列列从表中选择多个列?
我知道有很多与我得到的错误有关的问题,但我没有发现任何与多列相关或如何解决这个问题。
答案 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);