2013-02-09 38 views
2

嗨,我有點新linq到SQL我知道的基本知識。問題是我想在查詢中執行左連接。查詢中有3個表格。LEFT LINQ TO SQL C#在多對多表上加入

  1. 原告(所有行應該從這個表中返回)
  2. 索賠
  3. 用戶

查詢應返回誰擁有索賠的所有用戶。這是通過許多表索賠完成的。但不管用戶應該歸還所有索賠人。因此,左派加入了索賠人。

我有以下查詢

var d = (from Claimants in DB.Claimants 
       join Claims in DB.Claims on Claimants.Claiment_ID equals Claims.Claiment_ID 
       join Users in DB.Users on Claims.User_ID equals Users.User_ID 
       where (Claimants.TrialDate.Value >= dtDayStart & Claimants.TrialDate <= dtDayEnd) 
       select new 
       { 
        ClaimantFirstName = Claimants.FirstName, 
        ClaimantLasname = Claimants.LastName, 
        ClaimantsID = Claimants.IDNumber, 
        Claimants.OurReference, 
        Claimants.TrialDate, 
        InterviewStart = Claims.DateTimeStart, 
        InterviewEnd = Claims.DateTimeEnd, 
        Claims.Priority, 
        UserFirstname = Users.FirstName, 
        UserLastName = Users.LastName, 
        UserID = Users.IDNumber 
       }); 

我一直在使用一個試圖進入聲明如下,但沒有運氣

 var d = (from Claimants in DB.Claimants 
       join Claims in DB.Claims on Claimants.Claiment_ID equals Claims.Claiment_ID 
       into TheClaimants 
       from Claims in TheClaimants.DefaultIfEmpty() 

       join Users in DB.Users on Claims.User_ID equals Users.User_ID 
       where (Claimants.TrialDate.Value >= dtDayStart & Claimants.TrialDate <= dtDayEnd) 
       select new 
       { 
        ClaimantFirstName = Claimants.FirstName, 
        ClaimantLasname = Claimants.LastName, 
        ClaimantsID = Claimants.IDNumber, 
        Claimants.OurReference, 
        Claimants.TrialDate, 
        InterviewStart = Claims.DateTimeStart, 
        InterviewEnd = Claims.DateTimeEnd, 
        Claims.Priority, 
        UserFirstname = Users.FirstName, 
        UserLastName = Users.LastName, 
        UserID = Users.IDNumber 
       }); 

我將不勝感激,如果有人能在正確的方向指向我如何正確使用這些連接並解釋工作是如何進行的。非常感謝你提前。

+1

http://stackoverflow.com/a/3052610/8155 – 2013-02-09 13:43:57

+0

是否'Claimant'有一個導航屬性'索賠'?而'Claim'有一個導航屬性'Users'? – 2013-02-09 15:39:21

回答

0

你必須知道一個欒。如果你想讓所有的詛咒聲從頭開始選擇,然後將它們連接到其他表上。

嘗試以下方法:

LINQ to SQL Left Outer Join

0

在LINQ中, 「加入()」 擴展方法是SQL 的等效內連接

對於外連接您必須使用「.GroupJoin()」擴展方法。

假設你知道.Join,那麼GroupJoin很容易使用。我不得不承認,當我第一次需要在LINQ中進行外連接時,很難找出答案。我無法幻想他們爲什麼這樣稱呼它。

儘管在VB.Net,這裏即使在VB中呈現譯成LINQ語法不同的SQL結構,文章還易於轉換爲擴展方法:http://blogs.msdn.com/b/vbteam/archive/2007/12/31/converting-sql-to-linq-part-6-joins-bill-horst.aspx?Redirected=true

編輯:@DavidB張貼在他的評論一更好的解決方案,但前提是您可以使用某些ORM導航屬性。如果沒有他們,那麼羣組加入可能是最合理的

+0

選擇'GroupJoin'這個名字是因爲它實際上是加入和分組的混合體:左邊的實體是鍵,每個鍵都有一個組(0到n項)的正確實體。當linq提供程序由SQL引擎支持時,它恰好變成了外連接,但是在linq中,對象「GroupJoin」實際上是它所做功能的最佳描述。 – 2013-02-09 15:46:17

1
var d = (from Claimants in DB.Claimants 
    join Claims in DB.Claims on Claimants.Claiment_ID equals Claims.Claiment_ID) 
    .DefaultIfEmpty() 
    join Users in DB.Users on Claims.User_ID equals Users.User_ID 
    where (Claimants.TrialDate.Value >= dtDayStart & Claimants.TrialDate <= dtDayEnd) 
    .DefaultIfEmpty() 
    select new 
    { 
    ClaimantFirstName = Claimants.FirstName, 
    ClaimantLasname = Claimants.LastName, 
    ClaimantsID = Claimants.IDNumber, 
    Claimants.OurReference, 
    Claimants.TrialDate, 
    InterviewStart = Claims.DateTimeStart, 
    InterviewEnd = Claims.DateTimeEnd, 
    Claims.Priority, 
    UserFirstname = Users.FirstName, 
    UserLastName = Users.LastName, 
    UserID = Users.IDNumber 
}); 

Left outter join