我有一个为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);
}
答案 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服务器正在执行工作。