方法链接相当吗?
这工作正常(从初始测试)。
由于方法链接是我的首选格式,我试图弄清楚链接等价的方法是什么,但没有运气。 有任何想法吗?
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 y
的join 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表单是不可读的。