这里
i
是给定的 Store
(实体),Orders
是存储在 List<string>
中的 Customers
,列类型为 jsonb。如果任何一个 i
与任何一个 request.Orders
匹配,我需要获取 e.Orders
。
query = query.Where(i => i.Customers != null
&& i.Customers.Any(e => e.Orders != null
&& e.Orders.Intersect(request.Orders).Any()));
我收到此错误:
发生一个或多个错误。 (LINQ 表达式 'DbSet() .Where(p0 => EF.Property
值缓冲区表达式:
投影绑定表达式:Outer
IsNullable: False, "Id") != null && object.Equals(objA: (object)EF.Property(EntityShaperExpression:
) Lrb.Domain.Entities.Store 值缓冲区表达式:
投影绑定表达式:Outer
IsNullable: False, "Id"),
objB(对象)EF.Property(p0, "StoreId"))) .Any(p0 => p0.Orders != null && p0.Orders .相交(__request_Orders_1) .Any())' 无法翻译。附加信息:方法“System.Linq.Enumerable.Intersect”的转换失败。如果此方法可以映射到您的自定义函数,请参阅 https://go.microsoft.com/fwlink/?linkid=2132413 了解更多信息。以可翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端计算。请参阅 https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。)”
Intersect 方法是 System.Linq 命名空间的一部分,可以应用于任何实现 IEnumerable 的类型。使用复杂类型时(如您的情况Orders),我们应该使用采用 IEqualityComparer 参数的重载方法:
Intersect<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)
在您的情况下,应用默认比较器,由 LINQ Intersect Method 使用进行比较,并且该比较器仅检查两个对象引用是否相等,而不检查复杂对象的各个属性值。
除了这个使用问题之外,实体框架无法将 intersect 转换为 SQL 语句:Additional information: Translation of method 'System.Linq.Enumerable.Intersect' failed.
。您必须重写查询。