使用linq到实体获取不同的记录

嗨我在我的应用程序中使用linq实体。 我需要根据一个列值“名称”获取不同的记录

所以我有一个类似于你可以看到的表:

(User) ID Name Country DateCreated 

我需要根据名称(唯一)选择所有这些项目但是uniques。 是否有可能使用linq,如果是这样,请告诉我如何。

 var items = (from i in user select new {i.id, i.name, i.country, i.datecreated}).Distinct(); 

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 

上面的语法返回键,从而产生一个不同的列表。 更多信息:

http://imar.spaanjaars.com/546/using-grouping-instead-of-distinct-in-entity-framework-to-optimize-performance

发生的纯LINQ方式是按名称分组,按键选择不同的组,然后根据该选择。

 from i in user group new {i.ID, i.Country, i.DateRecord} by i.Name into byNmGp select byNmGp.First(); 

编辑:entity framework当然是一个非常受欢迎的linq提供程序,但它不能很好地处理First() ,虽然在逻辑上等效(在这种情况下) FirstOrDefault()将正常工作。 我不喜欢First()在没有被EF的限制强制进入FirstOrDefault() ,因为它的含义更符合这里所寻求的。

另一种方法是定义一个辅助类:

 private class MyRecord : IEquatable { 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查询做同样的事情,便利性会有所不同。

你可以使用这样的东西:

 var distinctReports = reports.Select(c => c.CompanyCode) .Distinct() .Select(c => reports.FirstOrDefault(r => r.CompanyCode == c)) .ToList(); 

您好,这里是如何选择内部联接的不同记录。 希望能帮助到你

 var distinctrecords = (entity.Table.Join(entity.Table2, x => x.Column, y => y.Column, (x, y) => new {x, y}) .Select(@t => new {@txColumn2, @tyColumn3})) .GroupBy(t => t.Column2) .Select(g => g.FirstOrDefault()); 

这是我最终使用的另一种变体,它基于Svetlana的反应。 显示使用唯一值填充GridView控件的示例。 谢谢!

  dataGridView_AnalyzeTestSuites.DataSource = ( from tr in _db.TestResults where tr.TaskId == taskId select new { TestSuiteName = tr.Test.TestSuite.Name } ).Distinct().ToList();