Linq возвращает IEnumerable <T> - PullRequest
       19

Linq возвращает IEnumerable <T>

2 голосов
/ 15 декабря 2009

Я хочу вернуть перечисляемые элементы, чтобы связать вложенную сетку. Верхняя сетка отображает название книги, а вложенная сетка отображает список авторов этой книги.

Авторская коллекция

static public Author[] Authors =
{
    new Author {FirstName="Johnny", LastName="Good"},
    new Author {FirstName="Graziella", LastName="Simplegame"},
    new Author {FirstName="Octavio", LastName="Prince"},
    new Author {FirstName="Jeremy", LastName="Legrand"}
}

Коллекция книг

static public Book[] Books =
{
    new Book
    {
        Title="Funny Stories",
        Publisher=Publishers[0],
        Authors=new[]{Authors[0], Authors[1]},
        PageCount=101,
        Price=25.55M,
        PublicationDate=new DateTime(2004, 11, 10),
        Isbn="0-000-77777-2",
        Subject=Subjects[0]
    },
    new Book
    {
        Title="LINQ rules",
        Publisher=Publishers[1],
        Authors=new[]{Authors[2]},
        PageCount=300,
        Price=12M,
        PublicationDate=new DateTime(2007, 9, 2),
        Isbn="0-111-77777-2",
        Subject=Subjects[0]
    },

    new Book 
    {
        Title="C# on Rails",
        Publisher=Publishers[1],
        Authors=new[]{Authors[2]},
        PageCount=256,
        Price=35.5M,
        PublicationDate=new DateTime(2007, 4, 1),
        Isbn="0-222-77777-2",
        Subject=Subjects[0]
    },
    new Book
    {
        Title="All your base are belong to us",
        Publisher=Publishers[1],
        Authors=new[]{Authors[3]},
        PageCount=1205,
        Price=35.5M,
        PublicationDate=new DateTime(2006, 5, 5),
        Isbn="0-333-77777-2",
        Subject=Subjects[2]
    },
    new Book
    {
        Title="Bonjour mon Amour",
        Publisher=Publishers[0],
        Authors=new[]{Authors[1], Authors[0]},
        PageCount=50,
        Price=29M,
        PublicationDate=new DateTime(1973, 2, 18),
        Isbn="2-444-77777-2",
        Subject=Subjects[1]
    }
};

1) Как написать метод Enumerable, который может возвращать следующий запрос?

(конечно, моя реализация неверна)

 public IEnumerable<Book> GetBook()
 {
    IEnumerable<Book> booklist
    =  from book in SampleData.Books
          select new Book
            {
             Title = book.Title,
             Authors = 
                      from author in SampleData.Authors
                      where book.Authors == author
                      select new Author
                      {
                         FirstName = author.FirstName
                       }
             };
    return booklist;
}

2) Вывод, полученный мной (вложенный список BulletedList не заполнен имя автора).

Authors     Title
---------------------------
            Funny Stories
            LINQ rules
            C# on Rails
            All your base are  belong to us 
            Bonjour mon Amour

Я подозреваю, что проблема в

where book.Authors == author  (checking Types with == operator).

Код HTML

<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False">
     <Columns>
           <asp:TemplateField HeaderText="Author List">
               <ItemTemplate>
                       <asp:BulletedList ID="BulletedList1" runat="server" 
                         DataSource='<%# Eval("Authors") %>'>
                        </asp:BulletedList>
                </ItemTemplate>
            </asp:TemplateField>
          <asp:BoundField DataField="Title" HeaderText="Title"
           SortExpression="Title" />
      </Columns>
 </asp:GridView>

Как улучшить кодировку, чтобы получить правильный результат?

Ответы [ 2 ]

1 голос
/ 15 декабря 2009

Вместо:

where book.Authors == author

Вы должны сделать что-то вроде:

where book.Authors.Contains(author)

Очевидно, что == не работает, потому что вы сравниваете одного автора с собранием авторов. Вы хотите проверить, содержит ли собрание авторов книги указанного автора.

0 голосов
/ 15 декабря 2009

Вместо использования Eval («Авторы») используйте Eval («Authors.FirstName»).

Кроме того, вам не нужно объединение книг и авторов. Вы можете просто выбрать свойство .Authors из объекта книги. (Я так понимаю, что Авторы на самом деле опечатка, и в этом случае она должна быть "Автор"?)

...