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类型的元素,为什么会发生这种情况?

C#中实体框架和列表的强制转换错误

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();