在 Entity Framework Core 中使用 Intersect 方法翻译 LINQ 查询失败

问题描述 投票:0回答:1

这里

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 了解更多信息。)”

c# .net entity-framework-core
1个回答
0
投票

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.

您必须重写查询。

© www.soinside.com 2019 - 2024. All rights reserved.