LINQ Left Outer Join с условиями «Больше чем и меньше чем дата» - PullRequest
0 голосов
/ 18 марта 2019

Я боролся с этим некоторое время и не могу найти синтаксис для внешнего соединения LINQ, которое имеет несколько условий, основанных на дате.Я изучал синтаксис GroupJoin, но он позволяет сравнивать только одно значение поля (обычно это идентификаторы).

Я хотел бы проверить, есть ли в родительской таблице дата (например, «UpdateDate»), которая выпадаетв пределах нескольких значений, определенных в дочерней таблице (например, «StartDate» и «EndDate»).Если родительская дата соответствует условию, извлеките один или два столбца из дочерней таблицы.Если нет, эти столбцы из дочерней таблицы должны быть нулевыми (классические левые соединения).

Я не думаю, что синтаксис запроса будет работать, потому что он распознает только эквиджоины.

ЕстьЕсть ли способ сделать это в LINQ с использованием синтаксиса Lambda? Я пытался использовать некоторую комбинацию «SelectMany» и «DefaultIfEmpty», но продолжаю застрять, пытаясь определить соединение.

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Используйте параметр ResultSelector из Queryable.GroupJoin , чтобы выбрать то, что вы хотите:

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,
                ...
            },
    }); 
0 голосов
/ 18 марта 2019

Способ сделать это в linq:

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