[英]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.