EF查询简化

时间:2018-10-02 11:54:01

标签: c# performance entity-framework linq

var filters = new List<AllowedFilterModel>();
var collections = _collectionManager.GetAll();

var storesLookup = collections.Select(c => new LookupModel
{
    Id = c.StoreId,
    DisplayName = c.StoreName
}).ToList();

var distinctstoresLookup = storesLookup.GroupBy(c => new {c.DisplayName,c.Id }).Select(c=>c.First()).ToList();

filters.Add(new CollectionFilterModel(FilterVariables.Store)
{
    FilterType = FilterDataType.Collection,
    AllowedValues = distinctstoresLookup
});

有没有一种方法可以简化此查询或将其中的一些组合?

1 个答案:

答案 0 :(得分:2)

您可以挂断中间的ToList呼叫。他们不必要地将查询具体化为一个列表。看来您的存储库应该查询数据库。 ToList强制进行客户端评估,这在很大程度上破坏了性能。使用SQL Server Profiler可以了解我的意思。

同样,_collectionManager.GetAll()必须返回IQueryable

您的GroupBy仅实现Distinct。然后,从每个组中选择第一个。但是同一组中的所有对象都是相同的。我怀疑这是一个逻辑错误...

根据查询的情况,您可以将其设置为:

var results =
 _collectionManager.GetAll()
 .Select(c => new LookupModel
 {
     Id = c.StoreId,
     DisplayName = c.StoreName
 })
 .Distinct()
 .ToList();

比使用所有这些临时变量更具可读性。