我正在尝试将DbLinq与SQLite数据库一起使用,但当我尝试将ITable
转换为Queryable<TEntity>
时,我遇到了问题。
DbLinq(Issue 211)中存在一个已知错误,可能是我问题的根源,但我想确保我的代码是正确的,如果是,请查明是否有某些内容我可以解决这个问题。
以下是尝试执行转换的通用存储库方法:
public IQueryable<TEntity> GetAll()
{
return Table.Cast<TEntity>(); // Table is an ITable
}
这是编译,但如果我传入IPerson
的{{1}}接口,表格中的实体类型为TEntity
(其中Person
),我'从DbLinq收到此错误:
S0133:实施QueryMethod Queryable.Cast。
为什么我要尝试这样做?
我有一个库项目,直到运行时才知道实体的类型,但它确实知道实体的接口。所以,我正在尝试转换为接口类型,以便我的库项目可以使用数据。
问题:
更新
我重新设计了我的存储库类,所以它现在需要Person : IPerson
和一个TEntity
,其中TEntityBase
是实体的实际类型,{{{ 1}}是我试图强制转换的界面。重要的是,我现在在我的类定义中有以下TEntity
子句:
TEntityBase
这允许我将where
属性存储为where TEntity : class, TEntityBase
而不是Table
,这样我就可以使用Table<TEntity>
(正如Stephen建议的那样)。以下是修订后的方法:
ITable
到目前为止,似乎来做这个伎俩。
答案 0 :(得分:2)
这听起来像个bug,但要明白实施LINQ提供程序是一项绝对巨大的努力。甚至(Microsoft的)LINQ to SQL和LINQ to Entities也对它们支持或不支持的LINQ查询/操作有自己的限制。
如果可以接受返回IEnumerable<T>
,则可以在致电Queryable.Cast
之前致电AsEnumerable
,以解决对Cast
缺乏支持的问题。但是,这限制了您的DAL的使用方式:由于不再返回IQueryable<T>
,因此不会将其他查询(例如Where
子句)传递给数据库图层。
答案 1 :(得分:2)
我同意这听起来像个错误。您可以尝试以下哪些操作
return Table.Select<TEntity>(tbl => (TEntity)tbl)
您可能必须添加where:ITable也适用于方法定义。