2

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

我为什么要这样做?

我有一个库项目,直到运行时才知道实体的类型,但它确实知道实体的接口。所以,我正在尝试转换为接口类型,以便我的库项目可以使用数据。

问题:

  1. 我是在尝试一个不可能的演员还是这绝对是 DbLinq 中的一个错误?
  2. 我还能如何解决我的问题?

更新

我重新设计了我的存储库类,所以它现在需要 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);
}

到目前为止,这似乎可以解决问题。

4

2 回答 2

2

这听起来像一个错误,但要理解实现 LINQ 提供程序绝对是一项巨大的工作。甚至(微软的)LINQ to SQL 和 LINQ to Entities 也对它们支持或不支持的 LINQ 查询/操作有自己的限制。

如果返回是可以接受的,那么您可以通过在调用之前调用IEnumerable<T>来解决缺乏支持的问题。但是,这限制了 DAL 的使用方式:由于不再返回,因此不会将进一步的查询(例如,子句)传递到 DB 层。Queryable.CastAsEnumerableCastIQueryable<T>Where

于 2010-05-12T19:23:48.543 回答
2

我同意这听起来像一个错误。您可以尝试以下将做同样的事情

return Table.Select<TEntity>(tbl => (TEntity)tbl)

您可能还必须将 where : ITable 添加到方法定义中。

于 2010-05-12T19:51:11.227 回答