我正在尝试将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/

10-14 08:37