您好我在我的应用程序中使用linq实体。我需要根据一个列值“名称”
获取不同的记录所以我有一张类似于下面的表格:
(User)
ID
Name
Country
DateCreated
我需要选择所有这些内容,但需要根据名称(唯一)进行单调。是否有可能使用linq,如果是这样,请告诉我如何。
var items = (from i in user select new {i.id, i.name, i.country, i.datecreated}).Distinct();
答案 0 :(得分:27)
Distinct()
方法效果不佳,因为它不会将DISTINCT SQL谓词发送到数据库。请改用group
:
var distinctResult = from c in result
group c by c.Id into uniqueIds
select uniqueIds.FirstOrDefault();
LINQ的小组实际上创建了由您指明的属性键入的实体子组:
Smith
John
Mary
Ed
Jones
Jerry
Bob
Sally
上面的语法返回键,从而产生一个不同的列表。更多信息:
答案 1 :(得分:8)
纯粹的LINQ方式是按名称分组,按键选择不同的组,然后根据它进行选择。
from i in user
group new {i.ID, i.Country, i.DateRecord} by i.Name into byNmGp
select byNmGp.First();
编辑:实体框架当然是一个非常受欢迎的linq提供程序,但它不能很好地处理First()
,尽管在逻辑上等效(在这种情况下)FirstOrDefault()
将正常工作。我不喜欢First()
因为EF的限制没有强制进入FirstOrDefault()
,因为它的含义更符合此处的要求。
另一种方法是定义一个辅助类:
private class MyRecord : IEquatable<MyRecord>
{
public int ID;
public string Name;
public string Country;
public DateTime DateCreated;
public bool Equals(MyRecord other)
{
return Name.Equals(other.Name);
}
public override bool Equals(object obj)
{
return obj is MyRecord && Equals((MyRecord)obj);
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}
/*...*/
var items = (from i in user select new MyRecord {i.ID, i.Name, i.Country, i.DateRecord}).Distinct();
这只是区别对待。性能因查询提供程序是否可以解释相等定义而有所不同。根据您是否有类似的LINQ查询做同样的事情,便利性会有所不同。
答案 2 :(得分:2)
您可以使用以下内容:
var distinctReports = reports.Select(c => c.CompanyCode)
.Distinct()
.Select(c => reports.FirstOrDefault(r => r.CompanyCode == c))
.ToList();
答案 3 :(得分:1)
您好,以下是如何使用内部联接选择不同的记录。希望它有所帮助
var distinctrecords =
(entity.Table.Join(entity.Table2, x => x.Column, y => y.Column, (x, y) => new {x, y})
.Select(@t => new {@t.x.Column2, @t.y.Column3}))
.GroupBy(t => t.Column2)
.Select(g => g.FirstOrDefault());
答案 4 :(得分:1)
这是我最后使用的另一种变体,它是基于斯韦特兰娜的回应。显示使用唯一值填充GridView控件的示例。谢谢!
dataGridView_AnalyzeTestSuites.DataSource = (
from tr in _db.TestResults
where tr.TaskId == taskId
select new { TestSuiteName = tr.Test.TestSuite.Name }
).Distinct().ToList();