代码之家  ›  专栏  ›  技术社区  ›  Ed Sinek

方法链等价?

  •  2
  • Ed Sinek  · 技术社区  · 14 年前


    这是正常工作(从最初的测试)。

    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)
                });
    

    谢谢,

    3 回复  |  直到 14 年前
        1
  •  6
  •   Community Justin Hirsch    7 年前

    我将重新排序查询以筛选出 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
  •  4
  •   Marc Gravell    14 年前

    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
  •  2
  •   usr    14 年前

    非顶层 选择多 电话:

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