2012-04-13 5 views
2

Linqで次のSQLクエリを再現しようとしています。同じテーブル/オブジェクトへの2つの結合でLinqを使用する複数の外部結合。 SQLを取得し、エンティティにLinqが必要

select 
    dbo.Documents.DocId, 
    dbo.Documents.ReykerAccountRef, 
    dbo.Documents.ReykerClientId DocClientID, 
    CAAs.ClientId CAAClientIDCheck, 
    ClientData.FullName ClientFullName, 
    CAAs.IFAId, 
    AdvisorData.FullName AdvisorFullName 
from dbo.Documents 
left join 
    dbo.CAAs on dbo.Documents.ReykerAccountRef = dbo.CAAs.AccountRef 
left join 
    dbo.hmsProfileDatas AS ClientData 
on 
    dbo.CAAs.ClientId = ClientData.ReykerClientID 
left join 
    dbo.hmsProfileDatas AS AdvisorData 
on 
    dbo.CAAs.IFAId = AdvisorData.ReykerClientID 

私はかつてアドバイザフルネームのクライアントフルネームや他のために、二度同じテーブルにリンクしようとしています。

私は、LINQで生産したい基本的なSQLは

select table1.*,table2.*,a.Fullname, b.Fullname 
from table1 
left join 
    table2 on table1.t2Id = table2.Id 
left join 
    table3 AS a 
on 
    table2.t3Id1 = table3.id1 
left join 
    table3 AS b 
on 
    table2.t3Id2 = table3.id2 

ので、表1は、表2に結合されているとテーブル2は、異なるフィールド(ID1とID2)にTABLE3する2つの外部キー(t3Id1とt3Id2)があります。

これは、私はいくつかのガイダンス以下しようとしたものですが、それは何も返しませんよ!何がうまくいかないの?

 var results3 = from doc in DataContext.Documents 
         from caa 
          in DataContext.CAAs 
          .Where(c => c.AccountRef == doc.ReykerAccountRef) 
          .DefaultIfEmpty() 
         from cpd 
          in DataContext.hmsProfileDatas 
          .Where(pdc => pdc.ReykerClientID == caa.ClientId) 
          .DefaultIfEmpty() 
         from apd 
          in DataContext.hmsProfileDatas 
          .Where(pda => pda.ReykerClientID == caa.IFAId) 
          .DefaultIfEmpty() 
         select new DocumentInList() 
            { 
             DocId = doc.DocId, 
             DocTitle = doc.DocTitle, 
             ReykerDocumentRef = doc.ReykerDocumentRef, 
             ReykerAccountRef = doc.ReykerAccountRef, 
             ClientFullName = cpd.FullName, 
             AdvisorFullName = apd.FullName, 
             DocTypeId = doc.DocTypeId, 
             DocTypes = doc.DocTypes, 
             DocDate = doc.DocDate, 
             BlobDocName = doc.BlobDocName, 
             UploadDate = doc.UploadDate, 
            }; 
+0

あなたはLINQクエリからSQLを「取得」と私はSQL Azureのに対して、これを使用していますし、SQLを確認する方法を働いていないDbの – NSGaga

+0

号にそれを試してみました。プロファイリングはありません。今すぐ管理パネルで確認してください! – NER1808

+0

しかし、あなたはそれをどんなDb、CEでもローカルでテストすることができます。あなたのことをまっすぐにすることをお勧めします。 EF/CFでは、物事を「動かす」のが簡単です。なぜそうしないのですか? – NSGaga

答えて

11

私はあなたの例を正しく理解したかったと思います。ここで別の簡単な例だ、それはあなたが必要なものを与える必要があります:それは生産

private class User 
    { 
     public int UserId; 
     public string Name; 
     public int GroupId; 
     public int CollectionId; 
    } 

    public class Group 
    { 
     public int GroupId; 
     public string Name; 
    } 

    public class Collection 
    { 
     public int CollectionId; 
     public string Name; 
    } 

    static void Main() 
    { 
     var groups = new[] { 
      new Group { GroupId = 1, Name = "Members" }, 
      new Group { GroupId = 2, Name = "Administrators" } 
     }; 
     var collections = new[] { 
      new Collection { CollectionId = 1, Name = "Teenagers" }, 
      new Collection { CollectionId = 2, Name = "Seniors" } 
     }; 
     var users = new[] { 
      new User { UserId = 1, Name = "Ivan", GroupId = 1, CollectionId = 1 }, 
      new User { UserId = 2, Name = "Peter", GroupId = 1, CollectionId = 2 }, 
      new User { UserId = 3, Name = "Stan", GroupId = 2, CollectionId = 1 }, 
      new User { UserId = 4, Name = "Dan", GroupId = 2, CollectionId = 2 }, 
      new User { UserId = 5, Name = "Vlad", GroupId = 5, CollectionId = 2 }, 
      new User { UserId = 6, Name = "Greg", GroupId = 2, CollectionId = 4 }, 
      new User { UserId = 6, Name = "Arni", GroupId = 3, CollectionId = 3 }, 
     }; 

     var results = from u in users 
         join g in groups on u.GroupId equals g.GroupId into ug 
         from g in ug.DefaultIfEmpty() 
         join c in collections on u.CollectionId equals c.CollectionId into uc 
         from c in uc.DefaultIfEmpty() 
         select new { 
          UserName = u.Name, 
          GroupName = g != null ? g.Name : "<No group>", 
          CollectionName = c != null ? c.Name : "<No collection>" 
         }; 
    } 

2は、他の2つのテーブルからデータを取得するために、1つのテーブルの上に結合します。ここ は出力です:

Ivan Members   Teenagers 
Peter Members   Seniors 
Stan Administrators Teenagers 
Dan  Administrators Seniors 
Vlad <No group>  Seniors 
Greg Administrators <No collection> 
Arni <No group>  <No collection> 
+0

すごくいいですね。ありがとう。私は前にその使用に気づいていなかった。 – NER1808

+0

最後に私が理解できるように単純な例を書いた人:) – aup

関連する問題