2011-04-29 37 views
0

我有了这本身自我引用,我想与其父亲一起加载配置文件在一个SQL配置文件父亲财产Profile类连接语句哪些错误与本组加入

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(); 
+1

你的说法可能是太复杂了LINQ作为一个单独的SQL语句解析。你可以在一个C#LINQ语句中编写你的GroupJoin吗? – mellamokb 2011-04-29 19:06:34

+0

对不起,如果我对linq没有那么熟练,但是这不是提取整个桌子?您正在获取ID,然后在另一个字段上的同一个表中将组加入(与所有reconr进行比较)... – 2011-04-29 19:26:08

回答

0

您的来电群组加入()也越来越因为您的来电MapFather的IEnumerable的版本是一个Func键<,>而不是表达>。因此,在加入团队之前,正在执行对个人资料和父亲的呼叫。

尽量内联MapFather():

var groupJoin = profiles.GroupJoin(fathers, 
            p => p.FatherID, 
            f => f.ID, 
            (p, fathers) => new Result() {Profile = p, Fathers = father.DefaultIfEmpty()}).ToList(); 
+0

我该如何将它作为表达式来执行? – 2011-04-29 20:12:44

+0

更新........ – 2011-04-29 20:24:50