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