Левое внешнее соединение SQL с методами расширения LINQ - PullRequest
0 голосов
/ 11 сентября 2018

Я искал способ преобразовать этот оператор SQL в методы расширения LINQ, но не нашел никакого подхода.

Select A.* FROM (A LEFT OUTER JOIN B ON A.ID=B.ID) Where B IS NULL

Должен ли я сначала делать где, затем соединение и, наконец, выбор. Какие методы я могу использовать.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Попробуйте это решение :

var result = (from A in listA
              join B in listB on A.ID equlas B.ID into subs
              from sub in subs.DefaultIfEmpty()
              where sub == null
              select A).ToList();
0 голосов
/ 12 сентября 2018

Вы можете использовать последовательность методов GroupJoin и SelectMany. Я сделал пример, в котором DbSet экземпляры представлены с простой коллекцией. Просто чтобы сделать это понятным и воспроизводимым:

[Test]
public void Linq_LeftOuterJoin()
{
    // Arrange
    List<A> A = new List<A>
    {
        new A { Id = 1},
        new A { Id = 2},
        new A { Id = 3},
        new A { Id = 4}
    };

    List<B> B = new List<B>
    {
        new B { Id = 3},
        new B { Id = 4}
    };

    // Act
    var join = A.GroupJoin(B, a => a.Id, b => b.Id, (a, b) => new {a, b})
                .SelectMany(t => t.b.DefaultIfEmpty(), (a, b) => new {a.a, b})
                .Where(t => t.b == null)
                .Select(t => t.a);

    //Assert
    Assert.AreEqual(join.Count(), 2);
    Assert.AreEqual(join.Count(a => a.Id == 1), 1);
    Assert.AreEqual(join.Count(a => a.Id == 2), 1);
}

Также, пожалуйста, посмотрите на этот вопрос со многими примерами. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...