在 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。
旧答案:
使用 GroupBy
在 Description
上分组,然后在 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
更好,我会感到惊讶。
为了提高性能,我试图用 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。
旧答案:
使用 GroupBy
在 Description
上分组,然后在 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
更好,我会感到惊讶。