При использовании GROUP BY Linq для создания списка групп, как я могу выбрать конкретную группу по ее ключу? - PullRequest
4 голосов
/ 28 января 2011

Я пытаюсь создать список групп на основе первой буквы названия книги, а затем отобразить все книги в группе под каждой конкретной буквой. Так, например, если бы текущая буква была «C», я бы хотел выбрать группу, в которой ее ключ также был «C». Я думал, что выполнение запроса для создания групп будет более эффективным, чем выполнение запроса для каждой буквы, но у меня проблемы.

Вот как я создаю группу (извините за VB) (Модель определена как IEnumerable (из Книги):

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. Я также попробовал «Выбрать группу Grp.Group», которая также, похоже, не помогает.

Любые предложения будут оценены!

UPDATE:

приведенный ниже ответ оказался верным, но я решил поделиться кодом после перевода на 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

1 Ответ

3 голосов
/ 28 января 2011

Вы должны явно определить свою проекцию (т. Е. «Упаковать» свою группу). Некоторые полезные 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...