在 Linq 中用 GroupBy(...) 替换 Distinct()

Replacing Distinct() with GroupBy(...) in Linq

为了提高性能,我试图用 GroupBy(...) 替换下面对 Distinct() 的调用,但是我遇到了错误。

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

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

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

您不能强制 Entity Framework 在生成的 SQL 中使用 GroupBy 而不是 Distinct 子句。 Entity framework 将确定适当的查询并使用它。

从您的代码中可以明显看出,您只对基于 unique 描述值的 List<string> 感兴趣。我认为您不必创建 SelectList 的集合。

你可以这样做:

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

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

以上两个查询都会生成一个唯一描述值列表。现在将根据 Entity Framework 生成什么类型​​的 SQL。


旧答案:

使用 GroupByDescription 上分组,然后在 Select 上分组,其中 Key 不为空,例如:

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

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

您可以按 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 更好,我会感到惊讶。