4

我正在尝试使用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();
4

2 回答 2

2

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

正如这里所说:

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

有关这方面的更多文档,请查看此处

于 2015-02-26T23:32:34.237 回答
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()来提取所需的记录。

于 2015-02-27T00:07:01.833 回答