首页 > 解决方案 > 如何在 C# 中使用 Linq 从多个嵌套列中选择特定字符串?

问题描述

我这里有个小问题。我有下表及其关系:

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;博士; 我想做一个 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;
        }

标签: c#mysqlentity-frameworklinq

解决方案


var vara = _context.maintable.Where(a => a.tablerelatedtomain.SelectMany(b => b.tablerelatedtoprevious).SelectMany(c => c.tablerelatedtoprevious).Any(c => c.status == "mystring")).ToList();
var varb = _context.maintable.Where(a => a.tablerelatedtomain.SelectMany(b => b.tablerelatedtoprevious).Any(b => b.status == "mystring")).ToList();
var varc = _context.maintable.Where(a => a.tablerelatedtomain.Any(a => a.status == "mystring")).ToList();
var result = vara.Union(varb).Union(varc).OrderBy(z => z.id).ToList();

return result;

推荐阅读