簡體   English   中英

在linq中連接具有多個條件的兩個表

[英]join two tables with multiple condition in linq

我是 LinQ 的新手,在執行 Linq 語句時遇到了一些問題。 下面是相同的總結。

我有兩個具有相同類類型的類對象,例如:Report r1、Report r2,它們具有月、ID、值等值。 兩個對象的值不同。 例如:

List<Report> r1 = new List<Report>();
List<Report> r2 = new List<Report>();

        r1.Add(new Report { month = 1, ID = 1, a = 5, b = 12 });
        r1.Add(new Report { month = 1, ID = 2, a = 6, b = 13 });
        r1.Add(new Report { month = 2, ID = 1, a = 6, b = 14 });
        r1.Add(new Report { month = 2, ID = 2, a = 8, b = 15 });
        r1.Add(new Report { month = 3, ID = 2, a = 9, b = 16 });


        r2.Add(new Report { month = 1, ID = 1, a = 5, b = 22 });
        r2.Add(new Report { month = 1, ID = 2, a = 6, b = 23 });
        r2.Add(new Report { month = 2, ID = 1, a = 6, b = 24 });


        var delreport =
                            from rr1 in r1
                            join rr2 in r2 on new { rr1.month, rr1.ID }
                            equals new { rr2.month, rr2.ID } into result
                            select result;

但是,我得到空白結果集。 我期望獲得與 r1 的月份id以及 r1 數據(a、b 值)匹配的 r2 數據(a、b 值)。 希望,我的問題很清楚,請求您的幫助。

我相信這就是你要找的

var innerJoin =
    from rr1 in r1
    join rr2 in r2 on new {rr1.Month, rr1.ID} equals new {rr2.Month, rr2.ID}
    select new { R1 = rr1, R2 = rr2 };

新的匿名對象可以是任何類型,並且可以訪問可用於連接的兩個集合的任何屬性。

對於左外連接,這是如何完成的

var leftJoin = 
    from rr1 in r1
    join rr2 in r2 on new {rr1.Month, rr1.ID} equals new {rr2.Month, rr2.ID} into ps
    from rr2 in ps.DefaultIfEmpty()
    select new { R1 = rr1, R2 = rr2 }; 

這是您查詢的鏈式版本。

var delreport= r1.Join(r2, l => l.ID, r => r.ID, (l, r) => new { lft = l, rght = r })
    .Where(x => x.lft.month == x.rght.month)
    .Select(_ => new{ _.rght.ID, _.rght.month}).ToList();

它經過測試並適用於您的數據。

如果您想連接兩個具有相同列 fkid 相同的表,則使用以下代碼將兩個表連接起來並訪問以獲得所需的結果,否則忽略。

以下db是數據庫實體對象。

注意:在您的代碼中,您加入不同的實體月份和 id 的數據不同,這導致您使用以下代碼獲得空結果

var v = (from a in db.r1.ToList()
         join b in db.r2.ToList() on a.Month equals b.ID

         select new
          {
            Id = a.ID,
            month = b.Month // or a.Month as you want,
            values = a.values
          });

通過使用這些,您可以訪問兩個表值並獲得可接受的結果。 謝謝,如果它對你有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM