У меня здесь небольшая проблема. У меня есть следующие таблицы с их отношениями:
Building
Batteries
Columns
Elevators
В здании может быть много батарей, в батареях может быть много столбцов, в столбцах может быть много лифтов.
У батареи есть одно здание, В столбце есть одна батарея, в лифте - одна колонка.
Если бы я сделал это var myintervention = _context.buildings.Where(b => b.batteries.Any(ba => ba.status == "Intervention")).ToList();
, в моем запросе было бы прекрасно работать, чтобы вывести список зданий, в которых есть батареи со статусом вмешательства (статус это столбец).
Проблема в том, что я не могу сделать что-то вроде _context.buildings.Where(c => c.columns.Any...)
, потому что модель здания не имеет доступа к классу столбцов, но батарея делает ... То же самое касается лифтов, здания не имеют доступ к лифтам, столбцы делают.
Вот как я определил свой modelBuilder:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Battery>()
.HasOne(p => p.buildings)
.WithMany(b => b.batteries)
.HasForeignKey(p => p.building_id);
modelBuilder.Entity<Column>()
.HasOne(p => p.batteries)
.WithMany(b => b.columns)
.HasForeignKey(p => p.battery_id);
modelBuilder.Entity<Elevator>()
.HasOne(p => p.columns)
.WithMany(b => b.elevators)
.HasForeignKey(p => p.column_id);
}
Вот как мои отношения выглядят в моих моделях:
building.cs
public List<Battery> batteries { get; set; }
battery.cs
public long building_id { get; set; }
public Building buildings { get; set; }
public List<Column> columns { get; set; }
column.cs
public long battery_id { get; set; }
public Battery batteries { get; set; }
public List<Elevator> elevators { get; set; }
elevator.cs
public long column_id { get; set; }
public Column columns { get; set; }
tl; dr ; Я хочу сделать запрос linq, чтобы получить список всех зданий, в которых есть батарея, столбец или лифт, чей столбец состояния имеет значение «Вмешательство».
ОБНОВЛЕНИЕ: очевидно, это работает, но не эффективно:
var myintervention = _context.buildings.Where(a => a.batteries.SelectMany(b => b.columns.SelectMany(c => c.elevators)).Any(c => c.status == "Intervention")).ToList();
Кажется, что это не так? Иногда вмешиваются батареи, и здание, связанное с этими батареями, не отображается в списке зданий. То же самое касается лифтов или колонн ... Я немного растерялся!
ОБНОВЛЕНИЕ 2: вот мой запрос:
[HttpGet("intervention")]
public List<Building> Getintervention(string status)
{
var myintervention = _context.buildings.Where(c => c.batteries.SelectMany(z => z.columns).Any(z => z.status == "Intervention")).ToList();
return myintervention;
}