Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如何使用EF 4.x DBSet上下文和IEqualityComparer获得一个独特的列表?_Asp.net Mvc 3_Entity Framework_Iequalitycomparer - Fatal编程技术网

Asp.net mvc 3 如何使用EF 4.x DBSet上下文和IEqualityComparer获得一个独特的列表?

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

我已经尝试了几个小时,以获得一个独特的工作为我的代码

我正在使用EF4.3、MVC3和Razor,并试图获得一个产品id和名称的列表。 当我对数据库运行Sql查询时,一切正常

Sql查询是

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);