.Distinct()调用不过滤

时间:2015-02-26 23:30:35

标签: c# linq entity-framework selectlistitem

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

但是,尽管调用了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();

2 个答案:

答案 0 :(得分:2)

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

正如here所述:

  

Distinct通过使用,返回序列中的不同元素   默认等式比较器来比较值。

一种解决方法,为了避免上述情况,因为我可以得出结论,你不需要整个对象而不是它的一个属性,就是将序列的每个元素投影到Division然后创建OrderBy并调用Distinct

var divisions = db.MarketingLookup.AsEnumerable()
                                  .Select(ml=>ml.Division)
                                  .OrderBy(division=>division) 
                                  .Distinct()
                                  .Select(division => new SelectListItem
                                  {
                                     Text = division,
                                     Value = division
                                  }).ToList();

有关此问题的进一步文档,请查看here

答案 1 :(得分:1)

替代选项(以及我们公司/团队经常使用的选项)是添加静态扩展方法(我们有扩展库)。

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

您可以在MarketingLookup来电中使用您喜欢的DistinctBy()属性,以便提取所需的记录。