【问题标题】:Method Chaining equivalent?方法链等效?
【发布时间】:2010-11-06 22:16:49
【问题描述】:


这工作正常(从初始测试开始)。
由于方法链接是我的首选格式,我试图弄清楚方法链接等价物是什么,但没有运气。有什么想法吗?

var data = (from p in db.Persons
            from c in db.Companies
            where c.CompanyName == companyName && p.CompanyId == c.CompanyId
            select p)
            .Select(p => new
            {
                Id = p.PersonId,
                Name = string.Format("{0} {1}", p.FirstName, p.LastName)
            });

谢谢,
--埃德

【问题讨论】:

  • 不透明的标识符是个棘手的问题...
  • “方法链接是我的首选格式”:如果您可以使用查询语法编写此代码,但不知道如何将其转换为方法语法,那何必呢?这种方式更具可读性。不要只使用一种语法,在某些情况下,一种比另一种更好......只需为手头的任务选择正确的语法。

标签: c# linq linq-to-sql lambda


【解决方案1】:

我会重新排序查询以首先过滤掉companyName,然后执行连接。这将允许您使用这种流畅的语法:

var query = db.Companies.Where(c => c.CompanyName == companyName)
              .Join(db.Persons, c => c.CompanyId, p => p.CompanyId, (p, c) => p)
              .Select(p => new
              {
                  Id = p.PersonId,
                  Name = string.Format("{0} {1}", p.FirstName, p.LastName)
              });

话虽如此,有些查询用查询语法写起来要容易得多,那为什么要限制自己呢?复杂的连接通常在查询语法中更好,您还可以使用SelectMany 连接格式和from ... from... 而不是join p in ... on x equals y。有关详细信息,请参阅此问题:When to prefer joins expressed with SelectMany() over joins expressed with the join keyword in Linq

【讨论】:

  • 这不是上面的翻译,虽然它是逻辑上等价的。
【解决方案2】:

在不更改查询的情况下,如下所示,其中oi 是不透明的标识符:

var data =  db.Persons.SelectMany(p =>  db.Companies, (p, c) => new {p,c})
    .Where(oi => oi.c.CompanyName == companyName
        && oi.p.CompanyId == oi.c.CompanyId)
    .Select(oi => oi.p)
    .Select(p => new
    {
        Id = p.PersonId,
        Name = string.Format("{0} {1}", p.FirstName, p.LastName)
    });

但是,您也可以考虑进行一些重写;可能是加入,或者更早地移动公司名称检查;并删除双选。

【讨论】:

    【解决方案3】:

    非顶层 from 子句转换为 SelectMany 调用:

    db.Persons.SelectMany(p => db.Companies.Select(c => new { p, c }))
    

    它不直观,而且有点笨拙(尽管合乎逻辑且可靠)。我个人倾向于将查询语法用于像这样的复杂查询,因为 SelectMany 表单不可读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多