方法链接相当吗?

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

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

谢谢,
–ed

我会稍微重新排序查询以首先过滤出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 yjoin p in ... on x equals y 。 有关更多详细信息,请参阅此问题: 何时首选使用SelectMany()表示的连接超过Linq中使用join关键字表示的连接 。

不改变查询,如下所示,其中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) }); 

但是,您可能还会考虑一些重写; 也许是加入,或提前移动公司名称检查; 并删除双选。

非子句子句转换为SelectMany调用:

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

它是非直观的,有点hacky(虽然逻辑和可靠)。 我个人倾向于将查询语法用于这样的复杂查询,因为SelectMany表单是不可读的。