Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中使用Linq从多个嵌套列中选择特定字符串?_C#_Mysql_Entity Framework_Linq - Fatal编程技术网

C# 如何在C中使用Linq从多个嵌套列中选择特定字符串?

C# 如何在C中使用Linq从多个嵌套列中选择特定字符串?,c#,mysql,entity-framework,linq,C#,Mysql,Entity Framework,Linq,我这里有个小问题。我有以下表格及其关系: Building Batteries Columns Elevators 一座建筑物可以有许多电池,电池可以有许多柱子,柱子可以有许多电梯 一个电池有一个建筑,一个柱子有一个电池,一个电梯有一个柱子 如果我执行这个var myintervention=\u context.buildings.Whereb=>b.batters.Anyba=>ba.status==Intervention.ToList;在我的查询中,如果返回一个

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

Building
  Batteries
    Columns
      Elevators
一座建筑物可以有许多电池,电池可以有许多柱子,柱子可以有许多电梯

一个电池有一个建筑,一个柱子有一个电池,一个电梯有一个柱子

如果我执行这个var myintervention=\u context.buildings.Whereb=>b.batters.Anyba=>ba.status==Intervention.ToList;在我的查询中,如果返回一个包含电池的建筑物列表,并且“干预状态”为一列,则效果会非常好

问题是我不能做像_context.buildings.Wherec=>c.columns.Any这样的事情。。。因为建筑模型没有访问column类的权限,但是电池有。。。电梯也是一样,建筑物没有电梯,柱子有

下面是我如何定义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);
    }
看起来好像不准确?有时干预中有电池,与这些电池关联的建筑不会出现在建筑列表中。电梯或柱子也是如此。。我有点迷路了

更新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;
        }

首先,请修复模型,使集合具有复数名称,而对象具有单个名称,否则您的代码将变得非常混乱:

building.cs
  public List<Battery> Batteries { get; set; }

battery.cs
  public long BuildingId { get; set; }
  public Building Building { get; set; }
  public List<Column> Columns { get; set; }

column.cs
  public long BatteryId { get; set; }
  public Battery Battery { get; set; }
  public List<Elevator> Elevators { get; set; }

elevator.cs
  public long ColumnId { get; set; }
  public Column Columns { get; set; }

现在,让我们向模型添加更多属性,以便它可以告诉我们有关干预的信息:

building.cs
  public List<Battery> Batteries { get; set; }

  [NotMapped]
  public bool IsInIntervention => this.Status == "Intervention" || Batteries.Any(b => b.IsInIntervention);

battery.cs
  public long BuildingId { get; set; }
  public Building Building { get; set; }
  public List<Column> Columns { get; set; }

  [NotMapped]
  public bool IsInIntervention => this.Status == "Intervention" || Columns.Any(c => c.IsInIntervention);


column.cs
  public long BatteryId { get; set; }
  public Battery Battery { get; set; }
  public List<Elevator> Elevators { get; set; }

  [NotMapped]
  public bool IsInIntervention => this.Status == "Intervention" || Elevators.Any(e => e.IsInIntervention);


elevator.cs
  public long ColumnId { get; set; }
  public Column Column { get; set; }

  [NotMapped]
  public bool IsInIntervention => this.Status == "Intervention";


现在,你可以问一栋建筑是否符合规定,如果是,它会说是,或者它拥有的任何东西符合规定


注意:如果模型没有加载实体,那么您可能需要采用这样的技巧:有条件地加载它们

c.batters.SelectManyz=>z.columns.Any是否有效?嗯,类似var myintervention=\u context.buildings.Wherec=>c.batters.SelectManyz=>z.columns.Anyz=>z.status==Intervention.ToList;是否可以显示建筑物列表,但我确定它链接了什么?当我检查所选建筑物的ID时,它与干预状态的列或电池不对应:您是否有可能使多个属性名称与单数/集合一致?例如battery.cs应该被称为battery.cs应该有公共建筑-这让人混淆为*!%有一个复数名称的属性,所以你假设它是一个集合,但它是一个单一的对象,所以你可以说它是建筑物,但你只能在集合上这样做。c中的属性名称以大写字母开头Letter@JeunePadawan不要编辑掉你的问题,如果你觉得它不再有用,请删除它。哇,非常感谢所有这些。。。是的,我现在只是在改变一切,但我总是犯错误,考虑到已经凌晨2点了,我太累了。不过我很好奇,你会如何查询IsiInervation?我用我的请求更新了主要帖子。如果这不合理,我很抱歉,明天早上我会把所有的东西都读回来。非常感谢你的帮助,我真的很感激。看起来我无法在模型中执行bool,我得到了以下错误:System.Linq.dll中发生了类型为“System.ArgumentNullException”的异常,但未在用户代码中处理:“Value can not null.”。试图修复它,但我不够好,我想可能是因为数据没有加载,所以例如build.batters是空的;你看到我粘贴的关于使用include/thenclude查询的链接了吗?我们在谈论的建筑物/电池/柱子/电梯有多少?它现在可以工作了!编辑问题以显示答案!可能不应该对一个问题进行如此剧烈的编辑,从而使答案变得毫无意义——将您的编辑作为答案发布,您可以接受它,并用向上投票的方式标记任何其他有用的答案。要访问问题的编辑版本,请复制您当前的编辑,将问题还原到先前的编辑,并将复制的文本作为答案发布,请点击问题上的“编辑的x分钟前”链接
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;
building.cs
  public List<Battery> Batteries { get; set; }

  [NotMapped]
  public bool IsInIntervention => this.Status == "Intervention" || Batteries.Any(b => b.IsInIntervention);

battery.cs
  public long BuildingId { get; set; }
  public Building Building { get; set; }
  public List<Column> Columns { get; set; }

  [NotMapped]
  public bool IsInIntervention => this.Status == "Intervention" || Columns.Any(c => c.IsInIntervention);


column.cs
  public long BatteryId { get; set; }
  public Battery Battery { get; set; }
  public List<Elevator> Elevators { get; set; }

  [NotMapped]
  public bool IsInIntervention => this.Status == "Intervention" || Elevators.Any(e => e.IsInIntervention);


elevator.cs
  public long ColumnId { get; set; }
  public Column Column { get; set; }

  [NotMapped]
  public bool IsInIntervention => this.Status == "Intervention";


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;