C#中实体框架和列表的强制转换错误
本文关键字:转换 错误 列表 实体 框架 | 更新日期: 2023-09-27 18:05:58
我创建了一个通用函数来获取EntityObject集合的特定页面:
public static IList<EntityObject> GetPageItemsOfCollection(IQueryable<EntityObject> collectionIQueryable,
int startIndex,
int pageSize)
{
if (collectionIQueryable == null)
return null;
return collectionIQueryable.Skip(startIndex).Take(pageSize).ToList();
}
当我尝试这样使用这个功能时:
IQueryable<EntityObjectSubClass> entityObjectSubClassIQueryable = GetEntityObjectSubClassIQueryableBySomeFilter(filter);
IList<EntityObjectSubClass> entityObjectSubClass = (IList<EntityObjectSubClass>) GetPageItemsOfCollection(entityObjectSubClassIQueryable, startIndex, pageSize)
Allways得到一个铸造错误:
无法强制转换
类型的对象System.Collections.Generic.List[System.Data.Objects.DataClasses.EntityObject]键入System.Collections.Generic.IList[Models.EntityObjectSubClass].
如果GetPageItemsOfCollection函数返回的IList包含EntityObjectSubClass类型的元素,为什么会发生这种情况?
IList<EntityObjectSubClass>
不会从IList<EntityObjectClass>
继承,也没有允许继承的相反类型。
考虑一下,如果我们有一个实现IList<EntityObjectClass>
的对象,那么就没有理由不让它充满EntityObjectSomeOtherSubClass
对象。它不能像IList<EntityObjectSubClass>
那样表演,所以它不能演成那样。
您最好的方法可能是将GetPageItemsOfCollection
方法简化为获取页面的单一任务,而不是获取页面并将其放入列表:
public static IQueryable<EntityObject> GetPageItemsOfCollection(IQueryable<EntityObject> collectionIQueryable, int startIndex, int pageSize)
{
if (collectionIQueryable == null)
return null;
return collectionIQueryable.Skip(startIndex).Take(pageSize);
}
(请注意,我返回IQueryable
而不是IEnumerable
,您可以选择返回IEnumerable
,但没有理由不允许对原始查询提供程序执行进一步的Linq操作,这样GetPageItemsOfCollection(fromADB, 10, 10).Any()
就可以在数据库上完全执行(。
然后你可以使用类似的:
GetPageItemsOfCollection(entityObjectSubClassIQueryable, startIndex, pageSize).Cast<EntityObjectSubClass>().ToList()
当然,您无论如何都可以使用它,而不更改GetPageItemsOfCollection
,但您将创建一个列表,只是在创建您真正想要的第二个列表时将其再次丢弃。
尝试使用Cast<T>()
方法
GetPageItemsOfCollection(entityObjectSubClassIQueryable, startIndex,pageSize)
.Cast<EntityObjectSubClass>.ToList();