0

各エンティティの最新のClientNoteレコードとともにクライアントレコードのリストを取得しようとしています。クライアントにメモが関連付けられていない場合、そのクライアントではClientNoteがnullになると予想されます(TSQLのLEFT JOINと同様)。

次のような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,
)

Client.Nameが'%ike%' AND(ClientNoteが存在しないかClientNote CreateDateが60日を超えている)の場合、Clientと最新のClientNoteを返すためにEF左外部結合が必要です。したがって、一致ごとに2つのオブジェクトを戻したいと思います。1つはクライアント、もう1つはオプションの(null)ClientNoteです。多くのことを試しましたが、求めている結果が得られません。

4

1 に答える 1

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;
}
于 2012-08-14T19:25:13.907 に答える