简体   繁体   English

C#Linq查询拼合多级类

[英]C# Linq query flattening multi-level classes

I have a class structure as follows below (there can be any number of each subclass and there can also be multiple Masters). 我的类结构如下(每个子类可以有任意数量,也可以有多个Master)。 I want use a linq query to get a flattened list of Subfolios, filtered by the “Index ” property of Subfolio. 我想使用linq查询来获取平整的Subfolios列表,并按Subfolio的“ Index”属性进行过滤。

I think I can get the Subfolios by Master using either: 我想我可以使用以下任一方法来获得Master的Subfolios:

IEnumerable< Subfolio> result = from dd in devices.Master
                     where dd.ID == 14
                     from pfo in dd. Portfolio
                     from folio in pfo.Folio
                     from subfolio in folio.Subfolio
                     where subfolio.Ind == 32
                     select subfolio;

Or 要么

IEnumerable<Subfolio> result =
            devices.master.Where(x => x.ID == 14)
                .SelectMany(y => y.PFO) 
                .SelectMany(z => z.Folio)
                .SelectMany(a => a.Subfolio)
                .Where(b=>b.Ind==32);

I could do the same for each slave and combine the results with the Master query, but is there a way of doing this in one linq operation. 我可以对每个从属服务器执行相同的操作,并将结果与​​Master查询合并,但是有一种方法可以在一个linq操作中执行此操作。 At the moment I am using a large nest of foreach loops, which is very clunky. 目前,我正在使用大量的foreach循环嵌套,这非常笨拙。

The simplified Class structure is: 简化的Class结构为:

Devices
  Master
    Portfolio
      Folio
         Subfolio
         Subfolio
      Folio
         Subfolio
         Subfolio
         Subfolio   
    Portfolio
      Folio
         Subfolio
         Subfolio
      Folio
         Subfolio
         Subfolio
         Subfolio
  Slave
     Portfolio
       Folio
         Subfolio
         Subfolio
       Folio
         Subfolio
         Subfolio
         Subfolio   
     Portfolio
       Folio
         Subfolio
         Subfolio
       Folio
         Subfolio
         Subfolio
         Subfolio
  Slave
     Portfolio
       Folio
         Subfolio
         Subfolio
       Folio
         Subfolio
         Subfolio
         Subfolio   
      Portfolio
       Folio
         Subfolio
         Subfolio
       Folio
         Subfolio
         Subfolio
         Subfolio

Not sure if this code will work (testing would take time), but something like that should do the trick: 不知道这段代码是否会工作(测试需要时间),但是类似的事情应该可以解决问题:

var resultMaster = devices.Master.SelectMany(y => y.PFO);
var resultSlave = devices.Slave.SelectMany(y => y.PFO);
var result = resultMaster.Union(resultSlave)
                         .SelectMany(z => z.Folio)
                         .SelectMany(a => a.Subfolio)
                         .Where(b=>b.Ind==32);

It's 3 parts for readability, but the query will be executed as one. 为了便于阅读,它分为3部分,但查询将作为一个部分执行。

Further to above, this is my full solution (I didn't make it clear that Slaves are a subclass of Masters) 在上面的内容中,这是我的完整解决方案(我不清楚从站是Master的子类)

 public nF GetValuebyuNidIndex(dev devices, UInt32 MuNID, ushort nFIndex)
    {
        var result_m = devices.wNode.Where(p => p.uNID == MuNID)
        .SelectMany(x => x.PFO);
        var result_s = devices.wNode.Where(p => p.uNID == MuNID)
        .SelectMany(x => x.sNode)
            .SelectMany(x => x.PFO);
        var combined = result_m.Union(result_s)
            .SelectMany(x => x.Folio)
            .SelectMany(x => x.nF)
            .Where(x => x.Ind == nFIndex);

        return combined.FirstOrDefault();
     }

This also works. 这也有效。 Presumably it compiles to the same thing? 大概可以编译成同一东西吗?

  public nF GetValuebyuNidIndex1(dev devices, UInt32 MuNID, ushort nFIndex)
    {
        var result_m = from dd in devices.wNode
                       where dd.uNID == MuNID
                       from pfo in dd.PFO
                       select pfo;
        var result_s = from dd in devices.wNode
                       where dd.uNID == MuNID
                       from snode in dd.sNode
                       from pfo in snode.PFO
                       select pfo;
        var combined = result_m.Union(result_s);
        var result = from cc in combined
                     from ff in cc.Folio
                     from nn in ff.nF
                     where nn.Ind == nFIndex
                     select nn;
        return result.FirstOrDefault();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM