Как исключить записи с пустой коллекцией в запросе linqC#

Место общения программистов C#
Ответить
Anonymous
 Как исключить записи с пустой коллекцией в запросе linq

Сообщение Anonymous »

У меня есть 3 таблицы в базе данных postgres (docker postgres:14.1-alpine).

Код: Выделить всё

public  class House
{
public Guid Id { get; set; }

public virtual ICollection Flats { get; set; }
public HouseType Type { get; set; }

}

public  class Flat
{
public Guid Id { get; set; }
public  House House { get; set; }
}

public  class HouseType
{
public Guid Id { get; set; }
public Guid IdMaterils { get; set; }
public virtual ICollection Houses { get; set; }
}
Я хочу найти дома с типом материала = «Некоторое значение GUID» и квартиры, идентификаторы которых равны «Другое значение GUID». Дома с пустыми квартирами-коллекторами должны быть исключены
Например, таблицы содержат такие данные:
Дома:

Код: Выделить всё

Id                                  |TypeId                              |
------------------------------------+------------------------------------+
dbec9670-46ef-47a0-8727-4a3c24a0f2ec|fdd1a587-9dc2-4c02-a375-39bdf3de775e|
e912d942-8d9c-4511-b0f8-6e3ac78bb8d2|fdd1a587-9dc2-4c02-a375-39bdf3de775e|
fd6f29ac-70aa-44ef-9257-c204a954f4ad|fdd1a587-9dc2-4c02-a375-39bdf3de775e|
Типы домов:

Код: Выделить всё

Id                                  |IdMaterils                          |
------------------------------------+------------------------------------+
fdd1a587-9dc2-4c02-a375-39bdf3de775e|85b7fb0e-4f8f-4d71-8c4b-d763ef5c767d|
0f99f64d-14bf-4732-b7cd-2e710889b20a|40744e83-b31a-4a62-81d0-9ad05f318aa2|
Квартиры:

Код: Выделить всё

Id                                  |HouseId                             |
------------------------------------+------------------------------------+
077fd0e3-af9d-468f-8209-3cb6bfc1cad1|dbec9670-46ef-47a0-8727-4a3c24a0f2ec|
0185c3d3-b18b-4616-a339-f1278c1ab46e|dbec9670-46ef-47a0-8727-4a3c24a0f2ec|
94c93b29-3bce-44b7-a97c-b490b47f78b7|e912d942-8d9c-4511-b0f8-6e3ac78bb8d2|
Я запускаю запрос:

Код: Выделить всё

var result = await _bookingContext.Houses
.Include((x => x.Flats.Where(x => x.Id == new Guid("077fd0e3-af9d-468f-8209-3cb6bfc1cad1"))))
.Include(x => x.Type)
.Where(x => x.Type.IdMaterils == new Guid("85b7fb0e-4f8f-4d71-8c4b-d763ef5c767d"))
.Where(x => x.Flats.Any()).ToListAsync();
Сгенерированный SQL:

Код: Выделить всё

SELECT h."Id", h."TypeId", h0."Id", t."Id", t."HouseId", h0."IdMaterils"
FROM "Houses" AS h
INNER JOIN "HouseTypes" AS h0 ON h."TypeId" = h0."Id"
LEFT JOIN (
SELECT f0."Id", f0."HouseId"
FROM "Flats" AS f0
WHERE f0."Id" = '077fd0e3-af9d-468f-8209-3cb6bfc1cad1'
) AS t ON h."Id" = t."HouseId"
WHERE h0."IdMaterils" = '85b7fb0e-4f8f-4d71-8c4b-d763ef5c767d' AND EXISTS (
SELECT 1
FROM "Flats" AS f
WHERE h."Id" = f."HouseId")
ORDER BY h."Id", h0."Id"
Упрощенный результат:

Код: Выделить всё

houseid                             |flatid                              |
------------------------------------+------------------------------------+
dbec9670-46ef-47a0-8727-4a3c24a0f2ec|077fd0e3-af9d-468f-8209-3cb6bfc1cad1|
e912d942-8d9c-4511-b0f8-6e3ac78bb8d2|                                    |
Что нужно добавить в запрос, чтобы появилось условие «t.Id is not null»?
Код не исключает записи там, где они оставлены Результат соединения равен нулю.
Это условие "

Код: Выделить всё

Where(x => x.Flats.Any())
"не работает
Как это сделать?
Я ожидал, что результатом будут только дома, в которых есть хотя бы квартира с идентификатором = '077fd0e3-af9d-468f -8209-3cb6bfc1cad1' и дом типа с IdMaterials= '85b7fb0e-4f8f-4d71-8c4b-d763ef5c767d'

Подробнее здесь: https://stackoverflow.com/questions/792 ... linq-query
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»