用Linq中的Group By(...)替换Distinct()

时间:2015-02-25 17:49:09

标签: c# performance linq distinct

为了获得性能提升,我尝试将Distinct()的调用替换为GroupBy(...),但我收到了错误。

有关如何重写此查询以使用GroupBy(...)的任何建议?

我正在尝试在GroupBy()字段上使用Description

var result=
         GetResults()
        .Select(x => new SelectList { Text = x.Description, Value = x.Description })
                      .Where(x => x.Text != null)
                      .Distinct()
                      .ToList();

2 个答案:

答案 0 :(得分:1)

您无法强制实体框架在生成的SQL中使用GroupBy而不是Distinct子句。实体框架将确定适当的查询,它将使用它。

您的代码中显而易见的一点是,您只对基于唯一描述值的List<string>感兴趣。我认为你不必创建SelectList的集合。

你可以这样做:

var result= GetResults()
             .Where(x => x.Description != null)
             .GroupBy(x => x.Description) 
             .Select(grp => grp.Key)
             .ToList();

OR

var result= GetResults()
             .Where(x => x.Description != null)
             .Select(x => x.Description)
             .Distinct()
             .ToList();

上述两个查询都会生成唯一描述值的列表。现在将针对这两种类型生成什么类型​​的SQL取决于实体框架。


旧答案:

使用GroupBy分组Description,然后Select,其中Key不为null,如:

var result= GetResults()
             .Select(x => new SelectList { Text = x.Description, Value = x.Description })
             .Where(x => x.Text != null)
             .GroupBy(x => x.Value) //Here select Value for Description
             .Select(grp => grp.Key)
             .ToList();

这不会给你任何性能提升,即使有任何性能提升,也可以忽略不计。

答案 1 :(得分:0)

您可以按Description分组:

var result=GetResults()
          .GroupBy(x => x.Description)
          .Where(g => g.Key != null)
          .Select(g => new SelectList { Text = g.Key, Value = g.Key })
          .ToList();

但如果你的表现更好Distinct,我会感到惊讶。