2011-04-29 31 views
0

に参加する私は、私は1つのSQLで、プロファイルの父親と一緒にプロファイルをロードしたい自分自身への自己参照父親の財産を持っているプロファイルのクラスを持っているの文いただきました。このグループで間違っては

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ステートメントとして解析するためには複雑すぎるかもしれません。 GroupJoinを単一のC#LINQステートメントに記述できますか? – mellamokb

+0

私はlinqで熟練していないのですが、これはテーブル全体をフェッチしないのですか? IDをフェッチして、別のフィールドの同じテーブルに参加する(すべての再構成と比較する)グループを作成しています... –

答えて

0

GroupJoin(へのあなたの呼び出し)>>、理由MapFatherへのお電話でのFunc <のIEnumerableバージョンを代わりに表現されてきています。したがって、プロファイルと父親への呼び出しは、GroupJoinの前に実行されています。

は)(MapFatherをインライン化してみてください。

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

これを式としてどのようにしますか? –

+0

更新........ –

関連する問題