C# 无法将IEnumerable强制转换为指定的类型

C# 无法将IEnumerable强制转换为指定的类型,c#,asp.net-mvc,linq,collections,anonymous-types,C#,Asp.net Mvc,Linq,Collections,Anonymous Types,我有一个名为ComicBookRepository的对象,其中包含一个ComicBook类型的列表(\u comicBooks) 作为此实现的一部分,我有一个名为GetComicBook()的方法,其中包含一个类型为int的参数“Id”,该参数返回一个ComicBook与传入的int参数匹配的Id属性 ComicBook comicBook = null; foreach (var book in _comicBooks) { if (book.Id == id) {

我有一个名为ComicBookRepository的对象,其中包含一个ComicBook类型的列表(\u comicBooks

作为此实现的一部分,我有一个名为GetComicBook()的方法,其中包含一个类型为int的参数“Id”,该参数返回一个ComicBook与传入的int参数匹配的Id属性

ComicBook comicBook = null;

foreach (var book in _comicBooks)
{
    if (book.Id == id)
    {
        comicBook = book;
        break;
    }
}

return comicBook;
我正在尝试获取此现有代码(可以正常工作),并使用匿名类型将其转换为LINQ表达式,如下所示:

var comicBook = from book in _comicBooks
                where book.Id == id
                select new
                {
                     Id = book.Id,
                     SeriesTitle = book.SeriesTitle,
                     IssueNumber = book.IssueNumber,
                     DescriptionHtml = book.DescriptionHtml,
                     Artists = book.Artists,
                     Favorite = book.Favorite
                };

return (ComicBook)comicBook;
但是,此代码返回InvalidCastException:

InvalidCastException: Unable to cast object of type 'WhereSelectArrayIterator`2[ComicBooksGallery.Models.ComicBook,<>f__AnonymousType0`6[System.Int32,System.String,System.Int32,System.String,ComicBooksGallery.Models.Artist[],System.Boolean]]' to type 'ComicBooksGallery.Models.ComicBook'.
编辑2:


正如一些人所指出的,整个过程可以用Lambda语法简化为一行代码

如果您正在设置的属性-
Id
seriesttle
等都是
ComicBook
的可设置属性,请更改

select new
{

由于您正在通过
Id
选择
ComicBook
(并且显然试图返回单个
ComicBook
),因此您希望查询只返回一个结果。即使是这样,
Select
仍会返回一个包含一项的结果集

要从结果集中获取该项,请将其添加到末尾

  • .First()
    如果总是有一个或多个结果。如果没有结果,它将抛出异常
  • .Single()
    抛出异常,除非查询只返回一个结果
  • .FirstOrDefault()
    返回第一项,如果没有项,则返回null

如果
\u comicBooks
是一个
列表
(或其他一些
IEnumerable
),您甚至可以将整个内容简化为

return _comicBooks.First(cb => cb.Id == id);
(或
FirstOrDefault
Single


new ComicBook
创建一个新实例,其属性与查询返回的实例相同。如果出于某种原因需要创建一个新实例,您可以这样做,但可能不需要这样做

如果您正在设置的属性-
Id
seriesttle
等都是
ComicBook
的可设置属性,请更改

select new
{

由于您正在通过
Id
选择
ComicBook
(并且显然试图返回单个
ComicBook
),因此您希望查询只返回一个结果。即使是这样,
Select
仍会返回一个包含一项的结果集

要从结果集中获取该项,请将其添加到末尾

  • .First()
    如果总是有一个或多个结果。如果没有结果,它将抛出异常
  • .Single()
    抛出异常,除非查询只返回一个结果
  • .FirstOrDefault()
    返回第一项,如果没有项,则返回null

如果
\u comicBooks
是一个
列表
(或其他一些
IEnumerable
),您甚至可以将整个内容简化为

return _comicBooks.First(cb => cb.Id == id);
(或
FirstOrDefault
Single


new ComicBook
创建一个新实例,其属性与查询返回的实例相同。如果出于某种原因需要创建一个新实例,您可以这样做,但可能不需要这样做

1)无法将匿名类型转换为ComicBook。2) 您的查询返回的是一个集合,而不是一本漫画书。谢谢您的回答。你是说即使id是唯一的,它仍然会返回一个集合吗?要获得单个结果,请尝试
var comicBook=\u comicBooks.Where(book=>book.id==id.FirstOrDefault()
为什么我不能将其转换为comicBook?
为什么不能将苹果称为橙色?基本上是因为它不是橘子。同样的原则也适用于您的代码。只需使用Scott Hannen的
return\u comicBooks.First(cb=>cb.Id==Id)1)无法将匿名类型转换为ComicBook。2) 您的查询返回的是一个集合,而不是一本漫画书。谢谢您的回答。你是说即使id是唯一的,它仍然会返回一个集合吗?要获得单个结果,请尝试
var comicBook=\u comicBooks.Where(book=>book.id==id.FirstOrDefault()
为什么我不能将其转换为comicBook?
为什么不能将苹果称为橙色?基本上是因为它不是橘子。同样的原则也适用于您的代码。只需使用Scott Hannen的
return\u comicBooks.First(cb=>cb.Id==Id)非常感谢Scott!这很有道理,为我解决了这个问题!干杯非常感谢你,斯科特!这很有道理,为我解决了这个问题!干杯