【问题标题】:When using Linq's GROUP BY to create a list of groups, how can I select a specific group by its key?使用 Linq 的 GROUP BY 创建组列表时,如何通过键选择特定组?
【发布时间】:2011-01-28 03:15:15
【问题描述】:

我在这里要做的是根据书名的第一个字母创建一个组列表,然后在每个特定字母下方显示组中的所有书籍。例如,如果当前字母是“C”,我想选择其键也是“C”的组。我认为运行查询来创建组会比为每个字母运行查询更有效,但我遇到了问题。

这是我创建组的方式(对于 VB 感到抱歉)(模型定义为 IEnumerable(of Book):

Dim TitleGroups = From Bk In Model Group Bk By Bk.FirstLetter Into Group Order By FirstLetter

如果我然后使用 TitleGroups 并遍历它,一切正常:

For Each Grp In TitleGroups
    Resposnse.Write(Grp.FirstLetter & "<br/>")

    For Each Bk In Grp.Group
        Response.Write(Bk.Title & "<br/>")
    Next
Next

但是如果我尝试选择一个组,它就不起作用:

Dim CurrentGroup = From Grp In TitleGroups Where Grp.FirstLetter = "A" Select Grp

我似乎无法使用我期望的 CurrentGroup 上的任何属性。我也尝试过“Select Grp.Group”,这似乎也没有帮助。

任何建议将不胜感激!

更新:

下面他们的回答被证明是正确的,但我想我会在翻译成 VB 后分享代码(不要评判我):

Dim TitleGroups = From Bk In Model _
                  Order By Bk.FirstLetter _
                  Group Bk By Bk.FirstLetter Into Books = Group, BkGrp = AsEnumerable() _
                  Select FirstLetter, Books

Dim CurrentGroup = From Grp In TitleGroups _
                   Where Grp.FirstLetter = "A" _
                   Select Grp

For Each Grp In CurrentGroup
    Response.Write(Grp.FirstLetter & "<br/>")

    For Each Book In Grp.Books
        Response.Write(Bk.Title & "<br/>")
    Next
Next

【问题讨论】:

    标签: linq asp.net-mvc-2 group-by


    【解决方案1】:

    您必须明确定义您的投影(即“打包”您的组)。一些有用的 LINQ 代码samples 可在此处获得。

    请参阅下面的代码的工作 C# 版本:

    var books = new[] { new Book("A book"),
        new Book("Your Book"),
        new Book("My book"),
        new Book("Anne's book") };
    
    var titleGroups = from book in books
        orderby book.FirstLetter
        group book by book.FirstLetter
        into bookGroup select new {FirstLetter = bookGroup.Key, Books = bookGroup};
    
    var currentGroup = from Grp in titleGroups 
         where Grp.FirstLetter == "A"
         select Grp.Books;
    
    foreach (var group in currentGroup)
    {
        Console.WriteLine(group.Key);  // First letter
    
        foreach (var book in group)
        {
            Console.WriteLine(book.Title);
        }
    }

    【讨论】:

    • 成功!!虽然把它翻译成VB很痛苦。顺便说一句,我女儿是个大读者,名叫安妮,所以 +1 是千里眼。
    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2021-10-27
    相关资源
    最近更新 更多