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