C# 无法将IEnumerable强制转换为指定的类型
我有一个名为ComicBookRepository的对象,其中包含一个ComicBook类型的列表(\u comicBooks) 作为此实现的一部分,我有一个名为GetComicBook()的方法,其中包含一个类型为int的参数“Id”,该参数返回一个ComicBook与传入的int参数匹配的Id属性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) {
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()
返回第一项,如果没有项,则返回null.FirstOrDefault()
如果
\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()
返回第一项,如果没有项,则返回null.FirstOrDefault()
如果
\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!这很有道理,为我解决了这个问题!干杯非常感谢你,斯科特!这很有道理,为我解决了这个问题!干杯