如何编写LINQ查询以使用C#从另一个对象获取对象?
我已经将下面的foreach循环转换为LINQ语句如何编写LINQ查询以使用C#从另一个对象获取对象?,c#,.net,linq,loops,object,C#,.net,Linq,Loops,Object,我已经将下面的foreach循环转换为LINQ语句 foreach (Plant plant in Plant.ListPlants) { foreach (Program program in plant.GetAllPrograms()) { if (program.GetProfitCenter() != null) { foreach (CostCenter costCenter in program.GetProf
foreach (Plant plant in Plant.ListPlants)
{
foreach (Program program in plant.GetAllPrograms())
{
if (program.GetProfitCenter() != null)
{
foreach (CostCenter costCenter in program.GetProfitCenter().GetAllCostCenters())
{
foreach (Account account in costCenter.GetAccounts())
{
if (account.Code == Code)//Code is a parameter
{
return account;
}
}
}
}
}
}
当不存在此类帐户代码时,结果也应返回null。
请帮助我为上述循环构建LINQ。使用
选择多个
var accounts = Plant.ListPlants
.SelectMany(lp => lp.GetAllPrograms())
.Where(p => p.GetProfitCenter() != null)
.SelectMany(p => p.GetProfitCenter().GetAllCostCenters())
.SelectMany(cc => cc.GetAccounts())
.Where(acc => acc.Code == Code);
return accounts.FirstOrDefault();
它与您已经编写的代码没有什么不同,只是您在最后完成了所有过滤
var accounts =
from plant in Plant.ListPlants
from program in plant.GetAllPrograms()
from costCenter in program.GetProfitCenter().GetAllCostCenters()
from account in costcenter.GetAccounts()
where program.GetProfitCenter() != null &&
account.Code == Code
select account;
return accounts.FirstOrDefault();
我不能保证这会起作用,但它会给你一个从哪里开始的好主意
return (from plant in Plant.ListPlants
from program in plant.GetAllPrograms()
where program.GetProfitCenter() != null
from costCenter in program.GetProfitCenter().GetAllCostCenters()
from account in costCenter.GetAccounts()
where account.Code == Code
select account).FirstOrDefault();
这应该行得通,我使用ReSharper功能将foreach转换为LINQ,与toadflakz解决方案不同的是,当我尝试使用“Plant.ListPlants.First(Plant=>Plant.GetAllPrograms().First(program=>program.GetProfitCenter()!=null&&program.GetProfitCenter()时,它不应该引发异常.GetAllCostCenters().First(costCenter=>costCenter.GetAccounts().First(account=>account.Code==Code));“但它显示无法隐式将帐户转换为boolIt有点难读,但我认为您需要在costCenter=>costCenter.GetAccounts()周围添加()首先(account=>account.Code==Code)我之所以选择这个答案,是因为我认为性能方面两者都是相同的,但不需要任何局部变量来存储中间结果,就像Tim Schmelter的答案一样。@sanmathi:accounts
只存储查询,只有FirstOrDefault
将执行它。因此,使用变量可以提高可读性和可维护性(例如,如果您希望在某个时间返回所有值),并且不需要任何成本。它还使调试变得更容易。@sanmathi:由于LINQ的延迟执行,性能上没有差异。这个问题本身(几乎)是不可能的。@timschmelter是正确的,他的回答应该被接受,因为他很快就发布了。My只保存了一行代码,这里没有真正的区别。您可以从Tim的答案中内联变量(即,return Plants.ListPlants…..Where(acc=>acc.code==code.FirstOrDefault();
)。这两个答案之间的真正区别在于,Michal使用的是查询语法而不是方法语法(又称fluent语法,又称lambda语法)()。不同的人对这两种语法有不同的偏好,尽管有些查询在其中一种语法中要干净得多。查询语法编译为方法语法,因此两者之间没有性能差异。