我正在尝试将DbLinq与SQLite数据库一起使用,但是当我尝试将ITable
转换为Queryable<TEntity>
时遇到了问题。
DbLinq(Issue 211)中存在一个已知的错误,这可能是我的问题的根源,但是我想确保我的代码是正确的,如果是,请找出是否有我可以做的工作围绕错误。
这是尝试进行强制转换的通用存储库方法:
public IQueryable<TEntity> GetAll()
{
return Table.Cast<TEntity>(); // Table is an ITable
}
可以编译,但是如果我在
IPerson
接口中传递TEntity
,并且表中实体的类型是Person
(其中Person : IPerson
),那么我从DbLinq得到此错误:S0133:实现QueryMethod Queryable.Cast。
我为什么要这样做?
我有一个图书馆项目,直到运行时才知道实体的类型,但它确实知道实体的接口。因此,我正在尝试转换为接口类型,以便我的库项目可以使用数据。
问题:
我是在尝试进行不可能的转换,还是DbLinq中的错误?
我还能如何解决我的问题?
更新资料
我对存储库类进行了重新设计,因此现在需要一个
TEntity
和一个TEntityBase
,其中TEntity
是实体的实际类型,而TEntityBase
是我要投射到的接口。重要的是,我现在在类定义中具有以下where
子句:where TEntity : class, TEntityBase
这使我可以将
Table
属性存储为Table<TEntity>
而不是ITable
,这使我可以使用AsEnumerable()
(如Stephen所建议)。这是修改后的方法:public IEnumerable<TEntityBase> GetAll()
{
return Table.AsEnumerable().Select(e => (TEntityBase)e);
}
到目前为止,这似乎可以解决问题。
最佳答案
听起来像是个错误,但请理解,实现LINQ提供程序绝对是一项巨大的努力。甚至(Microsoft的)LINQ to SQL和LINQ to Entries都对自己支持或不支持的LINQ查询/操作有确切的限制。
如果返回IEnumerable<T>
是可以接受的,则可以在调用Queryable.Cast
之前先调用AsEnumerable
来解决对Cast
缺乏支持的问题。但是,这限制了DAL的使用方式:由于不再返回IQueryable<T>
,因此其他查询(例如,Where
子句)将不会传递到DB层。
关于c# - 如何将LinqToSql Table <TEntity>转换为Table <IEntity>,其中TEntity:IEntity?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2821935/