LINQ左外连接的日期大于和小于日期

时间:2019-03-18 08:32:29

标签: linq conditional left-join

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

我想测试父表的日期(例如“ UpdateDate”)是否落在子表中定义的多个值(例如“ StartDate”和“ EndDate”)之内。如果父日期符合条件,请从子表中拉一两列。如果不是,则子表中的这些列应为null(经典的左连接内容)。

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

在LINQ中有没有使用Lambda语法做到这一点的方法?我一直在尝试使用“ SelectMany”和“ DefaultIfEmpty”的某种组合,但在尝试定义联接时一直遇到困难。

2 个答案:

答案 0 :(得分:0)

在linq中执行此操作的方法:

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

答案 1 :(得分:0)

使用Queryable.GroupJoin中的参数ResultSelector选择所需内容:

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,
            ...

“如果父日期符合条件,请从子表中拉一两列,否则子表中的那些列应为空”

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