无法使用SelectListitem获取不同的值

我正在尝试为下拉列表获取不同的值,但在使用以下语法时,它会将所有行返回给我。

有人可以告诉我如何使用正确的语法获得不同的值集?

IEnumerable ldidList = _db.TrafficHits.Select(c => new SelectListItem { Value = c.Id.ToString(), Text = c.ldid }).Distinct(); 

您当前代码的问题是Distinct将使用SelectListItem的默认比较器。 您需要提供这样的自定义比较器: –

 public class SelectListItemComparer : IEqualityComparer { public bool Equals(SelectListItem x, SelectListItem y) { return x.Text == y.Text && x.Value == y.Value; } public int GetHashCode(SelectListItem item) { int hashText = item.Text == null ? 0 : item.Text.GetHashCode(); int hashValue = item.Value == null ? 0 : item.Value.GetHashCode(); return hashText ^ hashValue; } } 

然后你就可以这样使用它: –

 IEnumerable ldidList = _db.TrafficHits.Select(c => new SelectListItem { Value = c.Id.ToString(), Text = c.ldid }).Distinct(new SelectListItemComparer()); 

您可以使用group by,然后选择每个组的第一个元素:

 IEnumerable ldidList = _db.TrafficHits .GroupBy(t => t.Id) .Select(g => g.First()) .Select(c => new SelectListItem { Value = c.Id.ToString(), Text = c.ldid }); 

我很确定SelectListItem没有值相等(即它不会覆盖Equals )。 每个都将被引用等同,因此即使它们具有相同的值,您的所有项目也不会相等。

通过Id假设您的“点击”是唯一的,请尝试:

 var items = _db.TrafficHits .GroupBy(h => h.Id) .Select(g => new SelectListItem { Value = g.Key.ToString(), Text = g.First().ldid });