0

我正在尝试使用 LINQ to Objects 将书籍列表绑定到网格视图。Author 和 Book 是自定义对象,其中“Books”在 Author 类中定义为列表。

    List<Author> authors = new List<Author>();
    // list of authors/books is populated here
    var books = from s in authors
                       where s.LastName == "Jones"
                       select s.Books;

    GridView2.DataSource = books.AsEnumerable().Cast<Book>().ToList();
    GridView2.DataBind();

但是我收到以下错误:

System.Web.Services.Protocols.SoapException:服务器无法处理请求。--->

System.InvalidCastException:无法转换类型的对象

'System.Collections.Generic.List`1[Book]' 输入'Book'。

在 System.Linq.Enumerable.d__aa 1.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 源)

我在这里做错了什么?

4

2 回答 2

1

我认为问题在于书籍是一个集合。所以你实际上得到了一系列书籍的集合

// list of authors/books is populated here
var books = (from s in authors
                   where s.LastName == "Jones"
                   select s.Books).SelectMany(c=>c);

使用SelectMany 会将您的图书收藏变成其中一本书 :-)

您还可以Cast使用 SelectMany 来满足您的需求:

 var books = from s in authors
                       where s.LastName == "Jones"
                       select s.Books;

    GridView2.DataSource = books.SelectMany(c => c).ToList();
    GridView2.DataBind();
于 2013-05-02T05:14:17.537 回答
0

这只是一个想法,否则我认为你很好。var books = (from s in authors where s.LastName == "Jones" select s.Books).Tolist(); 并直接传递这个 GridView2.DataSource = books ; GridView2.DataBind();

这可能有效..

于 2013-05-02T04:55:32.070 回答