Asp.net mvc 3 如何使用EF 4.x DBSet上下文和IEqualityComparer获得一个独特的列表?
我已经尝试了几个小时,以获得一个独特的工作为我的代码 我正在使用EF4.3、MVC3和Razor,并试图获得一个产品id和名称的列表。 当我对数据库运行Sql查询时,一切正常 Sql查询是Asp.net mvc 3 如何使用EF 4.x DBSet上下文和IEqualityComparer获得一个独特的列表?,asp.net-mvc-3,entity-framework,iequalitycomparer,Asp.net Mvc 3,Entity Framework,Iequalitycomparer,我已经尝试了几个小时,以获得一个独特的工作为我的代码 我正在使用EF4.3、MVC3和Razor,并试图获得一个产品id和名称的列表。 当我对数据库运行Sql查询时,一切正常 Sql查询是 SELECT DISTINCT [ProductId] ,[Product_Name] FROM [dbo].[PRODUCT] 该表中唯一的另一列是国家代码,因此标准distinct不起作用 我甚至创建了一个iQualityComparer 以下是代码: public class Dist
SELECT DISTINCT [ProductId]
,[Product_Name]
FROM [dbo].[PRODUCT]
该表中唯一的另一列是国家代码,因此标准distinct不起作用
我甚至创建了一个iQualityComparer
以下是代码:
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();
}
}
谁能告诉我我做错了什么
谢谢
David您有什么理由不使用如下所示的distinct
var distinctProdcts = (from p in db.PRODUCTs
select new {
ProductId = p.ProductId,
Product_Name = p.ProductName
}).Distinct();
这将在执行distinct之前从查询中删除国家代码。是否有任何原因不能使用如下distinct
var distinctProdcts = (from p in db.PRODUCTs
select new {
ProductId = p.ProductId,
Product_Name = p.ProductName
}).Distinct();
这将在您执行distinct之前从查询中删除国家代码。实体框架正在尝试将您的查询转换为SQL查询。显然,它不知道如何翻译IEQualityComparer。我认为问题在于,您是希望在数据库中执行Distinct,在这种情况下,您的客户机只会获得过滤结果,还是可以将所有数据带到客户机并在客户机上选择Distinct。如果您希望在数据库端进行过滤,这将使您的应用程序性能更好,并且您希望能够使用不同的策略进行比较,那么您可以提出一个代码,在查询的基础上构建不同的条件。如果您可以将数据提交给客户,请注意,这可能是您应该能够处理的大量数据。ToList将触发查询数据库并具体化结果:
IEnumerable<PRODUCT> y = db.PRODUCTs.ToList().Distinct(customComparer);
实体框架正在尝试将查询转换为SQL查询。显然,它不知道如何翻译IEQualityComparer。我认为问题在于,您是希望在数据库中执行Distinct,在这种情况下,您的客户机只会获得过滤结果,还是可以将所有数据带到客户机并在客户机上选择Distinct。如果您希望在数据库端进行过滤,这将使您的应用程序性能更好,并且您希望能够使用不同的策略进行比较,那么您可以提出一个代码,在查询的基础上构建不同的条件。如果您可以将数据提交给客户,请注意,这可能是您应该能够处理的大量数据。ToList将触发查询数据库并具体化结果:
IEnumerable<PRODUCT> y = db.PRODUCTs.ToList().Distinct(customComparer);