【问题标题】:Get first row of join获取第一行加入
【发布时间】:2012-10-01 12:24:46
【问题描述】:

我有一个连接两个表的 linq 查询(实际数据库中没有关系)

关系是: 公司 1 - n 电话

var miniCompanies =
    (from companies in db.Companies 
     join phones in db.Phones on companies.Id equals phones.CompanyId
     select new
     {
         companies.Name,
         phones.Phone,
     }).ToList().Distinct();

这会返回类似:

----------------------------
company1     |    12345    |
----------------------------
company1     |    23456    |
----------------------------
company2     |    43242    |
----------------------------
company2     |    34234    |
----------------------------
company2     |    65442    |
----------------------------

我只需要获取 Phones 表中的第一个而不是所有内容 如何做到这一点?
编辑:也许我不清楚要为此感到抱歉。
我说:
----------------------------------------
公司1 | 12345 |
----------------------------------------
公司2 | 43242 |
----------------------------------------

我想要每家公司的第一部手机

【问题讨论】:

  • 如果您的 DBML 中有关系,您可以这样做:var miniCompanies = db.Companies.Select(c => new { c.Name, c.Phones.First().Phone});
  • 那并不是 company2 的第一部手机。我假设您的意思是任何电话。
  • 不,那是打字错误,我会改正的
  • 第一个没有订单就没有意义

标签: c# linq join


【解决方案1】:

您可以使用 GroupBy:

var miniCompanies =
(from companies in db.Companies 
 join phones in db.Phones on companies.Id equals phones.CompanyId
 select new
 {
     companies.Name,
     phones.Phone,
 }).GroupBy(c=>c.Name).Select(c=>c.FirstOrDefault()).ToArray();

【讨论】:

    【解决方案2】:

    1 你可以试试First operator

    (from companies in db.Companies 
     join phones in db.Phones on companies.Id equals phones.CompanyId
     select new
     {
         phones.Phone,
     }).First();
    

    链接:http://msdn.microsoft.com/fr-fr/library/vstudio/system.linq.queryable.first.aspx

    2 你也可以使用FirstOrDefault

    链接:http://msdn.microsoft.com/fr-fr/library/vstudio/system.linq.queryable.firstordefault.aspx

    3 你也可以使用Take(1);

    链接:http://msdn.microsoft.com/fr-fr/library/vstudio/bb300906.aspx

    【讨论】:

    • ToList() 和 Distinct() 看起来有点浪费。
    • 这只会返回第一个公司和电话,而不是每个公司的第一个电话
    【解决方案3】:

    我会使用以下内容:

    var miniCompanies =
    (from companies in db.Companies 
     join phones in db.Phones on companies.Id equals phones.CompanyId
     select new
     {
         companies.Name,
         phones.Phone,
     }).ToList().Distinct().FirstOrDefault();
    

    “FirstOrDefault()”方法将返回集合中的第一项。如果集合不包含任何元素,则将返回默认对象。对于可空类型,这将是一个“空”对象。这是防止您的应用程序由于与空集合相关的异常而失败的好方法。

    【讨论】:

    • 这只会返回第一个公司和电话,而不是每个公司的第一个电话
    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多