gpt4 book ai didi

linq - 将 IEqualityComparer 与 LINQ to Entities except 子句结合使用

转载 作者:行者123 更新时间:2023-12-02 11:50:17 25 4
gpt4 key购买 nike

我有一个实体,我想将其与子集进行比较,并决定选择除子集之外的所有实体。

所以,我的查询如下所示:

Products.Except(ProductsToRemove(), new ProductComparer())

ProductsToRemove()方法返回 List<Product>在它执行一些任务之后。所以最简单的形式就是上面的内容。

ProductComparer()类看起来像这样:

public class ProductComparer : IEqualityComparer<Product>
{
public bool Equals(Product a, Product b)
{
if (ReferenceEquals(a, b)) return true;

if (ReferenceEquals(a, null) || ReferenceEquals(b, null))
return false;

return a.Id == b.Id;
}

public int GetHashCode(Product product)
{
if (ReferenceEquals(product, null)) return 0;
var hashProductId = product.Id.GetHashCode();
return hashProductId;
}
}

但是,我不断收到以下异常:

LINQ to Entities does not recognize the method 'System.Linq.IQueryable1[UnitedOne.Data.Sql.Product]
Except[Product](System.Linq.IQueryable
1[UnitedOne.Data.Sql.Product], System.Collections.Generic.IEnumerable1[UnitedOne.Data.Sql.Product],
System.Collections.Generic.IEqualityComparer
1[UnitedOne.Data.Sql.Product])' method, and this method cannot be translated into a store expression.

最佳答案

Linq to Entities 实际上并不执行您的查询,而是解释您的代码,将其转换为 TSQL,然后在服务器上执行。

在幕后,它是根据运算符和常用函数如何操作以及它们如何与 TSQL 相关的知识进行编码的。问题是 L2E 的开发人员不知道您到底是如何实现 IEqualityComparer 的。因此,他们无法弄清楚当您说Class A == Class B时,您的意思是(例如)“Where Person.FirstName == FirstName AND Person.LastName == LastName”.

因此,当 L2E 解释器遇到它无法识别的方法时,它会抛出此异常。

有两种方法可以解决这个问题。首先,开发一个满足您的平等要求但不依赖于任何自定义方法的 Where()。换句话说,测试实例属性的相等性,而不是测试类上定义的 Equals 方法。

其次,您可以触发查询的执行,然后在内存中进行比较。例如:

var notThisItem = new Item{Id = "HurrDurr"};
var items = Db.Items.ToArray(); // Sql query executed here
var except = items.Except(notThisItem); // performed in memory

显然,这将带来更多的数据传输并且占用更多的内存。第一个选项通常是最好的。

关于linq - 将 IEqualityComparer 与 LINQ to Entities except 子句结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2102886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com