我正在尝试将 DbLinq 与 SQLite 数据库一起使用,但是当我尝试将一个ITable
作为Queryable<TEntity>
.
DbLinq 中存在一个已知错误(问题 211),这可能是我的问题的根源,但我想确保我的代码是正确的,如果是,请找出我可以做些什么来解决错误。
这是尝试进行强制转换的通用存储库方法:
public IQueryable<TEntity> GetAll()
{
return Table.Cast<TEntity>(); // Table is an ITable
}
这可以编译,但是如果我传入接口IPerson
并且TEntity
表中实体的类型是Person
(其中Person : IPerson
),我会从 DbLinq 收到此错误:
S0133:实现QueryMethod Queryable.Cast。
我为什么要这样做?
我有一个库项目,直到运行时才知道实体的类型,但它确实知道实体的接口。所以,我正在尝试转换为接口类型,以便我的库项目可以使用数据。
问题:
- 我是在尝试一个不可能的演员还是这绝对是 DbLinq 中的一个错误?
- 我还能如何解决我的问题?
更新
我重新设计了我的存储库类,所以它现在需要 aTEntity
和a TEntityBase
,其中TEntity
是实体的实际类型,并且TEntityBase
是我试图转换到的接口。重要的是,我现在在我的类定义中有以下where
子句:
where TEntity : class, TEntityBase
这允许我将我的Table
属性存储为 aTable<TEntity>
而不是 a ITable
,这允许我使用AsEnumerable()
(正如斯蒂芬建议的那样)。这是修改后的方法:
public IEnumerable<TEntityBase> GetAll()
{
return Table.AsEnumerable().Select(e => (TEntityBase)e);
}
到目前为止,这似乎可以解决问题。