如何在Linq查询中使用Yield

| 我有以下方法:
    public string GetDepartmentTitle(string DepartmentAbbreviation) {
        List<TaxonomyItem> Divisions = TaxonomyFromCMS.GetAllItems(DomainDataConstants.DivisionAndDepartment.TAXONOMY_ID);
        List<TaxonomyItem> Departments = new List<TaxonomyItem>();

        Divisions.ForEach(delegate(TaxonomyItem Division) {
            Departments.AddRange(Division.SubTaxonomyItems);
        });

        TaxonomyItem Result = (from d in Departments
                               where d.Name == DepartmentAbbreviation
                               select d).FirstOrDefault();

        return Result == null ? \"\" : Result.Title;
    }
它首先读取所有Divisons(只有3个),但这些部门在其下有许多部门作为SubTaxonomyItems。目前,我遍历每个部门并提取出每个部门,并将它们放入一个称为部门的列表中。然后,我使用Linq搜索特定项目。 它很好用,但我想跳过/使用获取子项的第一步。我尝试了以下行似乎不起作用:
TaxonomyItem Result = (from d in Departments.SubTaxonomyItems
然后,我可能会通过某种lambda并使用foreach的Departments.SubTaxonomyItems包含一个yeild语句。那可能是诀窍,但我无法使它起作用。查看yeild语句,似乎可以通过某种扩展方法来解决。但我想看看是否可以内联完成,并且类似于以下伪代码:
    public string GetDepartmentTitle(string DepartmentAbbreviation) {
        List<TaxonomyItem> Divisions = TaxonomyFromCMS.GetAllItems(DomainDataConstants.DivisionAndDepartment.TAXONOMY_ID);

        TaxonomyItem Result = (from d in Divisions.ForEach(delegate(TaxonomyItem Division) {
                                 yeild return Divison.SubTaxonomyItems;
                               }) AS Dps
                               where Dps.Name == DepartmentAbbreviation
                               select Dps).FirstOrDefault();

        return Result == null ? \"\" : Result.Title;
    }
这可能是这种方式还是我没有看到的其他方式?没有扩展方法也可以完成吗?     
已邀请:
首先,您只需在查询中添加另一个“ from”即可轻松解决问题:
var query = from division in divisions
            from department in division.Departments
            where department.Name == whatever
            select department;
这正是您所做的。它从每个部门中选择部门的顺序,然后将所有这些顺序粘在一起,形成一个较长的部门顺序。 这为“将一堆序列缝在一起”方案提供了一种巧妙的语法。不过,更笼统地说,有时您会遇到这种情况:
var bars = from foo in foos
           some complicated query logic here
           select foo.bar;
var abcs = from bar in bars
           some other query logic here
           select bar.abc;
并且您想弄清楚如何使它成为一个查询。您可以这样做:
var abcs = from bar in (
               from foo in foos
               some complicated query logic here
               select foo.bar)
           some other query logic here
           select bar.abc;
这很丑陋,或者您可以执行以下操作:
var abcs = from foo in foos
           some complicated query logic here
           select foo.bar into bar
           some other query logic here
           select bar.abc;
这样做完全相同,但是阅读起来会更令人愉快。此语法称为“查询继续”。 要回答您的特定问题:在匿名方法或lambda中放置“收益率回报”是不合法的。这是非常不幸的,因为它将非常有用。编译器为使匿名函数和迭代器块起作用而执行的转换非常复杂,到目前为止,我们一直在努力使它们完全协同工作。 (也就是说,您可以将lambda放在迭代器块中,但不能将迭代器块放在lambda中。)我希望但不要保证,有一天我们将能够修复此代码并允许迭代器阻止lambda。 (请记住,Eric关于未来语言功能的想法仅出于娱乐目的。)     
看起来您只想要这样的东西。
public string GetDepartmentTitle(string DepartmentAbbreviation) {
    var items = TaxonomyFromCMS.GetAllItems(DomainDataConstants.DivisionAndDepartment.TAXONOMY_ID); 
    var result = items.SelectMany(item=>item.SubTaxonomyItems).FirstOrDefault(item=>item.Name == DepartmentAbbreviation);
    var text = result !=null  ? result.Title : String.Empty;
    return text;
}
    
收益率回报率仅可用于非常特殊的位置(双关),Linq查询也不是其中之一。幸运的是,您在这里不需要它。
var q = from division in Divisions
        from dps in division.SubTaxonomyItems
        where dps.Name == DepartmentAbbreviation
        select dps.Title;

return q.FirstOrDefault() ?? String.Empty;
    
为什么不做:
var divisions = TaxonomyFromCMS.GetAllItems
                 (DomainDataConstants.DivisionAndDepartment.TAXONOMY_ID);

var titles = from division in divisions
             from deparment in division.SubTaxonomyItems
             where deparment.Name == DepartmentAbbreviation
             select deparment.Title;

return titles.FirstorDefault() ?? \"\";
    
您在寻找这个linq吗?
var Result = Divisions.SelectMany(d => d.SubTaxonomyItems).Where(subItem => subItem.Name == DepartmentAbbreviation).FirstOrDefault();
    

要回复问题请先登录注册