2012-08-14 46 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