2

こんにちは、linq to sql の初心者です。基本については知っています。問題は、クエリで左結合を実行したいことです。クエリには 3 つのテーブルがあります。

  1. 請求者 (すべての行がこのテーブルから返される必要があります)
  2. 請求
  3. ユーザー

クエリは、要求者を持つすべてのユーザーを返す必要があります。これは、多対多テーブル クレームによって行われます。ただし、ユーザーに関係なく、すべての申立人を返還する必要があります。したがって、Clairant の左結合。

次のクエリがあります

    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
                 });

次のようにintoステートメントを使用しようとしましたが、運がありません

        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
                 });

これらの結合を左右に正しく使用し、どのように機能するかを説明する方法について、誰かが私を正しい方向に向けることができれば幸いです。事前にどうもありがとうございました。

4

3 に答える 3

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
 });

左外部結合

于 2013-02-09T13:55:53.933 に答える
0

LINQ では、".Join()" 拡張メソッドは SQLの内部結合に相当します。

外部結合の場合、「.GroupJoin()」拡張メソッドを使用する必要があります。

.Join をよく知っていると仮定すると、GroupJoin は簡単に使用できます。私が最初に LINQ で外部結合を行う必要があったとき、それを見つけるのは非常に困難だったことを認めなければなりません。なぜ彼らがそれをそのように呼んだのか、私には理解できません。

VB.Net では、LINQ 構文に変換されたさまざまな SQL コンストラクトを紹介する記事がありますが、VB であっても拡張メソッドに簡単に変換できます: http://blogs.msdn.com/b/vbteam/archive/2007/ 12/31/converting-sql-to-linq-part-6-joins-bill-horst.aspx?Redirected=true

編集: @DavidB は、コメントにはるかに優れたソリューションを投稿しましたが、ORM ナビゲーション プロパティを使用できる場合に限ります。それらがない場合は、おそらく GroupJoin が最も合理的です

于 2013-02-09T13:40:21.453 に答える
0

ルアンを知っている必要があります。すべての Claiments が返されるようにする場合は、Claiments から選択して開始し、他のテーブルに結合したままにします。

以下を試してください:

LINQ to SQL 左外部結合

于 2013-02-09T13:25:07.073 に答える