Entity Framework Core Исключить результаты - PullRequest
0 голосов
/ 10 сентября 2018

Как с помощью Entity Framework Core и ASP.NET Core 2.1 можно вернуть результаты из одной таблицы, но только если этот идентификатор строки НЕ найден во второй таблице?

Например, только первые две строки в таблице Entity1 должны быть возвращены, поскольку третья строка имеет ссылку, хранящуюся в таблице Entity2.

Entity1 Table

+-----------+-----------+
| Entity1Id | Name      |
+-----------+-----------+
| 1         | Row One   |
| 2         | Row Two   |
| 3         | Row Three |
+-----------+-----------+

Entity2 Table

+-----------+-----------+-----------+
| Entity2Id | Name      | Entity1Id |
+-----------+-----------+-----------+
| 1         | Row One   | 3         |
+-----------+-----------+-----------+

Ответы [ 2 ]

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

Вы могли бы сделать ...

var result = dbContext.Entity1.Where(w => !w.Entity2.Any()).ToList();

Это должно вернуть все строки Entity1, в которых нет записей Entity2.

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

Самый простой способ - использовать подзапрос, который можно описать следующим образом:

enter image description here

И теперь мы можем легко перевести формулу в следующие коды:

IQueryable<Entity1> q = _context.Entity1.FromSql(
    @"select * from Entity1 
    where not exists(
        select Entity2.Id from Entity2 where Entity2.Entity1Id = Entity1.Id
    )"
);

Еще один способ сделать это - левое внешнее соединение:

IQueryable<Entity1> q = from i in _context.Entity1
                        join j in _context.Entity2 on i.Id equals j.Entity1Id into jj
                        from x in jj.DefaultIfEmpty()
                        where jj.All(x=> x.Entity1Id!=i.Id)
                        select i ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...