Linq的Distinct()方法没有做任何事情

时间:2018-03-15 23:06:14

标签: c# entity-framework linq

我有一个为Entity Framework定义的通用查询方法,如下所示。当我打电话给API时,我回到了一个包含大量重复元素的列表。为什么.Distinct()似乎什么都不做?我想要查看整个对象,而不仅仅是单个属性。

    internal IHttpActionResult GetCachedDataOrderedBy<TEntity, TResult>(Func<TEntity, TResult> selector, Func<TResult, string> orderby)
        where TEntity : class
    {
        using (var context = new DataModel.LabSOREntities())
            return Ok(context.Set<TEntity>()
                         .AsNoTracking()
                         .Select(selector)
                         .OrderBy(orderby)
                         .Distinct()
                         .ToArray());
    }

我这样称呼它:

   public IHttpActionResult GetCountries()
    {
        return GetCachedDataOrderedBy<vw_Location, Country>(r => new Country {
            CountryCode = r.Country_Code,
            CountryName = r.Country_Name,
            RegionCode = r.Region_Code
        }, r => r.CountryCode);
    }

1 个答案:

答案 0 :(得分:1)

你的'Country'类没有实现适当的Equals和GetHashCode方法,所以Distinct()使用引用相等,没有任何对象是相等的。

更大的问题是为您的选择器使用Func实现了查询,因此所有工作都在客户端进行。你的辅助函数需要表达式:

internal IHttpActionResult GetCachedDataOrderedBy<TEntity, TResult>(
    Expression<Func<TEntity, TResult>> selector, 
    Expression<Func<TResult, string>> orderby)

这应该允许Entity Framework将整个事物编译为SQL表达式并在SQL服务器上执行它。此时,Country上的Equals和GetHashCode方法无关紧要,因为SQL服务器正在执行工作。