这是正常的(从最初的测试)
由于方法链接是我的首选格式,我试图弄清楚链接等效方法是什么,但没有运气。有什么想法吗?
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
答案 0 :(得分:5)
我会稍微重新排序查询以首先过滤掉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...
。有关详细信息,请参阅此问题:When to prefer joins expressed with SelectMany() over joins expressed with the join keyword in Linq。
答案 1 :(得分:4)
不改变查询,如下所示,其中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)
});
但是,你也可以考虑一些重写;也许是加入,或提前移动公司名称检查;并删除双选。
答案 2 :(得分:2)
来自子句的非顶级转换为 SelectMany 调用:
db.Persons.SelectMany(p => db.Companies.Select(c => new { p, c }))
这是非直观的,有点hacky(虽然逻辑和可靠)。我个人倾向于将查询语法用于像这样的复杂查询,因为SelectMany表单是不可读的。