簡體   English   中英

C#Linq查詢拼合多級類

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

我的類結構如下(每個子類可以有任意數量,也可以有多個Master)。 我想使用linq查詢來獲取平整的Subfolios列表,並按Subfolio的“ Index”屬性進行過濾。

我想我可以使用以下任一方法來獲得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;

要么

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);

我可以對每個從屬服務器執行相同的操作,並將結果與​​Master查詢合並,但是有一種方法可以在一個linq操作中執行此操作。 目前,我正在使用大量的foreach循環嵌套,這非常笨拙。

簡化的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

不知道這段代碼是否會工作(測試需要時間),但是類似的事情應該可以解決問題:

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);

為了便於閱讀,它分為3部分,但查詢將作為一個部分執行。

在上面的內容中,這是我的完整解決方案(我不清楚從站是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();
     }

這也有效。 大概可以編譯成同一東西嗎?

  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