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