我有一个Profile类,它有一个自我引用自己的父属性,我想在一个sql join语句中加载一个配置文件和它的父辈配置文件
Select * FROM profile left join profile as father on profile.fatherid = father.id where profile.id = 650
所以我创建了以下linq语句,但是没有运行关于它的sql语句而是运行以下语句
select * from profiles
select * from profiles where id = 650
然后在内存中将它们组合在一起,但显然我不想加载整个数据库。
private class Result
{
public Profile Profile { get; set; }
public IEnumerable<Profile> Fathers { get; set; }
}
private Result MapFather(Profile p, IEnumerable<Profile> father)
{
return new Result() {Profile = p, Fathers = father.DefaultIfEmpty()};
}
var profiles = from p in db.Profiles where p.ID.Equals(650) select p;
var fathers = from f in db.Profiles select f;
var groupJoin = profiles.GroupJoin(fathers,
p => p.FatherID,
f => f.ID,
MapFather).ToList();
答案 0 :(得分:0)
您对GroupJoin()的调用是获取IEnumerable版本,因为您调用MapFather是一个Func&lt;,&gt;而不是表达&gt;。因此,在GroupJoin之前正在执行对配置文件和父亲的调用。
尝试内联MapFather():
var groupJoin = profiles.GroupJoin(fathers,
p => p.FatherID,
f => f.ID,
(p, fathers) => new Result() {Profile = p, Fathers = father.DefaultIfEmpty()}).ToList();