[英]Cast error with Entity Framework and Lists in C#
我创建一个通用函数来获取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)
总是出现强制转换错误:
无法转换类型的对象
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>
,因此不能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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.