我正在尝试使用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();
答案 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()
属性,以便提取所需的记录。