繁体   English   中英

使用C#中的实体框架和列表进行转换错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM