具有大于和小于日期条件的 LINQ 左外连接

LINQ Left Outer Join with Greater Than and Less Than Date Conditions

我为此苦苦挣扎了一段时间,但找不到具有基于日期的多个条件的 LINQ 外部联接的语法。我一直在研究 GroupJoin 语法,但这只能让您比较一个字段值(通常是 ID)。

我想测试父 table 的日期(例如 "UpdateDate")是否属于子 table 中定义的多个值(例如 "StartDate"和 "EndDate")。如果父日期符合条件,则从子 table 中拉出一两列。如果不是,子项 table 中的那些列应该为空(经典的左连接内容)。

我认为查询语法不起作用,因为它只识别等值连接。

有没有办法在 LINQ 中使用 Lambda 语法执行此操作? 我一直在尝试使用 "SelectMany" 和 "DefaultIfEmpty" 的某种组合,但是尝试定义连接时一直卡住。

在linq中的实现方式:

var q = from a in TableA
        from b in TableB.where(x => a.Date > x.StartDate && a.Date < x.EndDate).DefaultIfEmpty()
        select {...}

使用 Queryable.GroupJoin 的参数 ResultSelector 到 select 你想要的:

var result = dbContext.Parents.GroupJoin(dbContext.Children,

    // outer and inner key Selectors:
    parent => parent.Id,       // from every parent take the primary key
    child => child.ParentId,   // from every child take the foreign key to parent

    // ResultSelector: take the parent and all his children to make one new object
    (parent, children) => new
    {
        // Select only the Parent properties you actually plan to use:
        Id = parent.Id,
        Name = parent.Name,
        ...

        Children = children.Select(child => new
        {
            // select only Child properties you plan to use:
            Id = child.Id,
            // No need: you know the value: ParentId = child.ParentId,
            ...

"If the parent date fits the condition, pull a column or two from the child table, otherwise those columns from the child table should be null "

            SpecialColumnA = (parent.BirthDay.Year < 2000) ?? child.BirthDay : null,
            SpecialColumnB = (parent.Name == "Kennedy" ?? child.Name : null,
    });

如果很多列的条件相同,考虑只检查一次:

        SpecialColumns = (parent.Birthday.Year >= 2000) ? null :
            // else fill the special columns:
            new
            {
                Name = child.Name,
                SomeWeirdProperty = parent.Id + child.Id,
                ...
            },
    });