2012-08-14 80 views
0

我正在嘗試獲取客戶端記錄的列表以及最近的ClientNote記錄。如果客戶端沒有關聯的筆記,我希望ClientNote對於該客戶端爲空(類似於TSQL中的LEFT JOIN)。Tricky在EF中與外部連接加入表中的條件

我有2個相關的表看起來像:

CREATE TABLE [dbo].[Client](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [ClientNumber] [varchar](10) NOT NULL, 
    [Name] [varchar](100) NOT NULL, 
    [AssociateName] [varchar](30) NOT NULL, 
    [AssignedToID] [int] NULL, 
    [District] [varchar](6) NOT NULL, 
    [RegionID] [int] NOT NULL, 
    [CreateDate] [datetime] NOT NULL, 
) 

CREATE TABLE [dbo].[ClientNote](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [ClientID] [int] NOT NULL, 
    [Note] [varchar](4000) NOT NULL, 
    [NoteDate] [datetime] NULL, 
    [TicklerDate] [datetime] NULL, 
    [EnteredByAgentID] [int] NOT NULL, 
    [CreateDate] [datetime] NOT NULL, 
) 

我需要一個EF LEFT OUTER JOIN返回客戶端和最新ClientNote當 Client.Name LIKE '%IKE%' AND(或者沒有ClientNote存在或ClientNote CreateDate超過60天)。 因此,我想爲每個匹配返回兩個對象:一個客戶端和一個可選(空)客戶端筆記 我已經嘗試了很多東西,我只是沒有得到我尋求的結果。

回答

0

嘗試像下面,你還可以改變過去從的SingleOrDefault()來FirstOrDefault()或可能到一個數組:

var clientInfo = (from a in yourdatacontext.Client 
    join b in yourdatacontext.ClientNote on a.ID equals b.ID into temp 
    from t in temp.DefaultIfEmpty() //this is what does the left outer join 
    where a.Name.Contains("ike") && b.CreateDate > DateTime.Now.AddDays(60) 
    select new { 
     a, 
     t 
    }).SingleOrDefault(); //or change to .ToArray(); 
foreach (var client in clientInfo) 
{ 
    var client.a.t.yourfieldname; 
    //or 
    var client.a.yourfieldname; 
} 
+0

似乎並沒有工作。我做了幾次嘗試,但沒有成功。 – WebWarrior 2012-08-16 05:33:55

+0

@ user856806你得到了什麼錯誤?當你說它不起作用你是什麼意思?如果你想訪問返回的內容,可以這樣做:'var myAssociateName = clientInfo.a.AssociateName'或者如果你想在第二個表中做些什麼,你可以做一個'var myNoteDate = clientInfo.atNoteDate' – Richard 2012-08-16 10:07:16

+0

@ user856806我注意到,在你的數據庫中,你的CreateDate作爲DateTime字段,而原始查詢無法工作,我修改它以反映你的數據庫佈局。 – Richard 2012-08-17 18:19:37