1

我已经尝试了几个小时来让 Distinct 为我的代码工作。

我正在使用 EF 4.3、MVC3、Razor 并尝试获取产品 ID 和名称的列表。当我对数据库运行 Sql 查询时,它很好。

Sql 查询是

SELECT DISTINCT [ProductId]
      ,[Product_Name]
  FROM [dbo].[PRODUCT]

该表中唯一的另一列是国家代码,这就是标准 distinct() 不起作用的原因。

我已经创建了一个 IEqualityComparer

这是代码:

public class DistinctProduct : IEqualityComparer<PRODUCT>
    {
        public bool Equals(PRODUCT x, PRODUCT y)
        {
            return x.ProductId.Equals(y.ProductId);
        }

        public int GetHashCode(PRODUCT obj)
        {
            return obj.ProductId.GetHashCode();
        }
    }

这是我叫它的地方。

IEqualityComparer<PRODUCT> customComparer = new DistinctProduct();
IEnumerable<PRODUCT> y = db.PRODUCTs.Distinct(customComparer);

但是当它到达最后一行时,我得到一个错误说明......

LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[MyService.Models.PRODUCT] Distinct[PRODUCT](System.Linq.IQueryable`1[MyService.Models.PRODUCT], System.Collections.Generic.IEqualityComparer`1[MyService.Models.PRODUCT])' method, and this method cannot be translated into a store expression.

谁能告诉我我做错了什么?

谢谢,

大卫

4

2 回答 2

3

有什么理由你不能使用像下面这样的独特的吗?

var distinctProdcts = (from p in db.PRODUCTs
                       select new { 
                           ProductId = p.ProductId, 
                           Product_Name = p.ProductName 
                      }).Distinct();

这将在您执行 distinct 之前从查询中删除国家/地区代码。

于 2012-05-17T21:44:30.033 回答
2

Entity Framework 正在尝试将您的查询转换为 SQL 查询。显然它不知道如何翻译 IEqualityComparerer。我认为问题是您是否要在数据库中执行 Distinct(在这种情况下,您的客户端只会获得过滤的结果),或者您可以将所有数据带到客户端并在客户端上选择 distinct。如果您希望在数据库端进行过滤(这将使您的应用程序性能更好)并且您希望能够使用不同的策略进行比较,您可以提出在查询之上构建不同标准的代码。如果您可以将数据带到客户端(请注意,它可能是很多数据),您应该可以这样做(.ToList() 将触发查询数据库并实现结果):

IEnumerable<PRODUCT> y = db.PRODUCTs.ToList().Distinct(customComparer);
于 2012-05-17T23:55:37.380 回答