在linq

时间:2017-09-10 03:28:51

标签: c# linq

我是LinQ的新手,在执行Linq语句时遇到了一些问题。以下是相同的摘要。

我有两个具有相同类类型的类对象,例如:Report r1,Report r2,其值包含month,ID,values。两个对象的值都不同。例如:

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;

但是,我得到了空白的结果集。我希望r2数据(a,b值)与r1的 id 以及r1数据(a,b值)匹配。 希望,我的问题很明确,请求你的帮助。

3 个答案:

答案 0 :(得分:1)

我相信这就是你要找的东西

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

答案 1 :(得分:-1)

这是您的查询的链版本。

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

经过测试并可以处理您的数据。

答案 2 :(得分:-1)

如果你想加入两个表,同一列的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
          });

通过使用这些,您可以访问两个表值并获得接受的结果。谢谢你是否可以使用它。