自我加入LINQ

时间:2019-02-03 19:51:03

标签: c# sql linq

C

我正在寻求转换为linq查询。据我所知,不到符号不能转换为Linq查询。请提出建议。我有一个字符串日期,我需要与linq进行比较。

2 个答案:

答案 0 :(得分:0)

正如您所说,Linq在EquiJoin之外不支持其他类型的joinDocs非常清楚您可以做什么来绕过此问题:

  • 您可以使用简单的交叉联接(笛卡尔积),然后在where子句中应用非等联接的条件。
  • 或者您可以使用临时变量存储仅包含查询所需属性的新表,并且像以前一样,在where子句中应用条件。

在您的情况下,可能的Linq查询可能是这样的:

from f1 in firmwares
from f2 in firmwares
let f1_date = DateTime.Parse(f1.Dt)
let f2_date = DateTime.Parse(f2.Dt)
where f1.Group_Id == f2.Group_Id && f1_date < f2_date
group f1 by f1.Id into fres
select new {
    Id = fres.Key,
    Count = fres.Count()
};

但是,我仍然在思考如何模拟LEFT JOIN,而不将其强制加入组联接。

答案 1 :(得分:0)

当然可以使用<符号。只需使用方法语法而不是查询语法即可!

每个FW1具有零个或多个FW2s。每个FW2恰好属于一个FW1。使用外键firmware_group_id来实现一对多。

显然,您希望所有FW1s都具有其FW2s的编号,并且它们的属性public的值等于1,并且属性br-date大于br-dateFW1的值。

每当您想要一个包含许多子项目(使用外键)的项目时,例如s学校与学生,顾客与订单,书与页面,您都需要Enumerable.GroupJoin < / p>

var result = FW1.GroupJoin(FW2,      // GroupJoin FW1 and FW2
    fw1 => fw1.firmware_group_id,    // from fw1 take the primary key firmware_group_id
    fw2 => fw2.firmware_group_id,    // from fw2 take the foreing key firmware_group_id

    (fw1, fw2s) => new               // from every fw1, with all its matching fw2s 
    {                                // make one new object containing the following properties:
        Id = fw1.Id,

        // Count the fw2s of this fw1 that have public == 1
        // and a date larger than fw1.date
        Count = fw2.Where(fw2 => fw2.Public == 1 && fw1.br_date < fw2.br_date)
                   .Count(),         
    });

注意: