C# 下拉列表根据列表中的文本属性选择“不同”

C# 下拉列表根据列表中的文本属性选择“不同”,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,我有一个要求,我需要为我的下拉值获取一个唯一/不同项的列表。参见下面的示例 示例数据 Id Text 1 AAA 2 BBB 3 AAA 4 CCC 5 BBB 我希望结果列表应该是 Id Text 1 AAA 2

我有一个要求,我需要为我的下拉值获取一个唯一/不同项的列表。参见下面的示例

示例数据

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属性进行区分。还有,第一次出现。

您可以简单地使用
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})

如果要在多个属性上定义组,请执行以下操作:

List<something> myList= employee.GroupBy(p => new {p.employeeId, p.employeeName} )
  .Select(g => g.First())
  .ToList();
List myList=employee.GroupBy(p=>new{p.employeeId,p.employeeName})
.Select(g=>g.First())
.ToList();

Distinct
有一个重载,它占用了一个
IEqualityComparer
。因此,您可以编写一个比较器并提供它。
或者,您可以通过(扩展)方法编写一个
DistinctBy。你可以在Jon Skeet的店里找到。但你也可以很容易地自己写:

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)));
}
公共静态IEnumerable DistinctBy(此IEnumerable源,
Func键选择器,IEqualityComparer比较器=null)
{
var found=新哈希集(比较器);
返回source.Where(element=>found.Add(keySelector(element));
}
编辑:我实际上是指,但是MiscUtil也很有用。

请注意,此方法适用于
IEnumerable
,而不是
IQueryable

您尝试过什么吗?向我们展示您的价格。“由多个属性区分”听起来与“基于文本属性区分”不同,但他提到“基于文本属性区分”