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

时间:2010-08-22 16:19:14

标签: c# linq-to-entities

您好我在我的应用程序中使用linq实体。我需要根据一个列值“名称”

获取不同的记录

所以我有一张类似于下面的表格:

(User)
ID
Name
Country
DateCreated

我需要选择所有这些内容,但需要根据名称(唯一)进行单调。是否有可能使用linq,如果是这样,请告诉我如何。

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

5 个答案:

答案 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

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

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

答案 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();