C# .Distinct()调用不进行筛选

C# .Distinct()调用不进行筛选,c#,linq,entity-framework,selectlistitem,C#,Linq,Entity Framework,Selectlistitem,我试图使用AsEnumerable将实体框架DbContext查询拉入IEnumerable中。这将用作填充视图中下拉列表的模型属性 但是,尽管调用了Distinct(),每个查询仍会返回重复的条目 public IEnumerable<SelectListItem> StateCodeList { get; set; } public IEnumerable<SelectListItem> DivCodeList { get; set; } DivCodeLi

我试图使用
AsEnumerable
将实体框架
DbContext
查询拉入
IEnumerable
中。这将用作填充视图中下拉列表的模型属性

但是,尽管调用了
Distinct()
,每个查询仍会返回重复的条目

public IEnumerable<SelectListItem> StateCodeList { get; set; }
public IEnumerable<SelectListItem> DivCodeList { get; set; }    

DivCodeList =
    db.MarketingLookup.AsEnumerable().OrderBy(x => x.Division).Distinct().Select(x => new SelectListItem
                    {
                        Text = x.Division,
                        Value = x.Division
                    }).ToList();

StateCodeList =
    db.MarketingLookup.AsEnumerable().OrderBy(x => x.State).Distinct().Select(x => new SelectListItem
                    {
                        Text = x.State,
                        Value = x.State
                    }).ToList();
public IEnumerable StateCodeList{get;set;}
公共IEnumerable DivCodeList{get;set;}
分区代码表=
db.MarketingLookup.AsEnumerable().OrderBy(x=>x.Division).Distinct().Select(x=>newselectListItem
{
Text=x.除法,
值=x.除法
}).ToList();
状态代码表=
db.MarketingLookup.AsEnumerable().OrderBy(x=>x.State).Distinct().Select(x=>newselectListItem
{
Text=x.状态,
值=x.状态
}).ToList();

为了使
独特
生效,如果类型是自定义类型,则序列必须包含实现
IEquatable
接口的类型的对象

如前所述:

Distinct通过使用 用于比较值的默认相等比较器

为了避免上述情况,一种解决方法是将序列中的每个元素投影到
分区
,然后生成
OrderBy
,并调用
Distinct

var divisions = db.MarketingLookup.AsEnumerable()
                                  .Select(ml=>ml.Division)
                                  .OrderBy(division=>division) 
                                  .Distinct()
                                  .Select(division => new SelectListItem
                                  {
                                     Text = division,
                                     Value = division
                                  }).ToList();
有关这方面的更多文档,请查看。

另一种选择(也是我们公司/团队经常使用的)是添加静态扩展方法(我们有一个扩展库)


您可以在
DistinctBy()
调用中使用
MarketingLookup
的任意属性来提取所需的记录。

太棒了,谢谢您的解释!!一次快速编辑-只需将
文本
应用于
x
,而不是
x.Division
,因为
x
被指定了我要查找的值。@NealR我刚刚看到了你的评论编辑,并更正了它。非常感谢你。
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    return source.Where(e => seenKeys.Add(keySelector(e)));
}
var divisions = db.MarketingLookup.AsEnumerable().DistinctBy(d => d.PrimaryKey)
    .Select(x => new SelectListItem { Text = x.Division, Value = x.Division }).ToList();