如何编写LINQ查询以使用C#从另一个对象获取对象?

如何编写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循环转换为LINQ语句

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语法)()。不同的人对这两种语法有不同的偏好,尽管有些查询在其中一种语法中要干净得多。查询语法编译为方法语法,因此两者之间没有性能差异。