我要求我需要为我的下拉列值获取唯一/不同项目的列表。请参阅下面的示例
示例数据
Id Text
1 AAA
2 BBB
3 AAA
4 CCC
5 BBB
我希望结果列表应该是,
Id Text
1 AAA
2 BBB
4 CCC
我到目前为止尝试了
var Value = (from x in db.Items
where ((x.CallNo.StartsWith(q) || x.CallNo.Contains(" " + q)) && (!string.IsNullOrEmpty(x.CallNo)))
select new
{
id = x.Id,
text = x.CallNo
}).Distinct().ToList();
意思是,我想根据Text属性区分列表。而且,第一次出现。
答案 0 :(得分:0)
您只需使用GroupBy
和First
:
var Value = db.Items
.Where(x => x.CallNo.StartsWith(q) || x.CallNo.Contains(" " + q)) && !string.IsNullOrEmpty(x.CallNo))
.GroupBy(x => x.CallNo)
.Select(g => g.First())
.Select(x => new
{
id = x.Id,
text = x.CallNo
})
.ToList();
如果您确实希望通过多个属性获取不同的对象,则标题建议在GroupBy
中使用匿名类型。
.GroupBy(x => new { x.CallNo, x.OtherProperty})
答案 1 :(得分:0)
如果要在多个属性上定义组,请按以下方式进行:
List<something> myList= employee.GroupBy(p => new {p.employeeId, p.employeeName} )
.Select(g => g.First())
.ToList();
答案 2 :(得分:0)
Distinct
的重载需要IEqualityComparer<TSource>
。所以你可以写一个比较器并提供它
或者,您可以编写DistinctBy
(扩展名)方法。你可以在Jon Skeet的MiscUtil library中找到它。但你也可以自己轻松写出来:
public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> source,
Func<T, TKey> keySelector, IEqualityComparer<TKey> comparer = null)
{
var found = new HashSet<TKey>(comparer);
return source.Where(element => found.Add(keySelector(element)));
}
编辑:我实际上是指MoreLinq library,但MiscUtil也很有用
请注意,此方法适用于IEnumerable
,而非IQueryable
。