我正在尝试将 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. 我还能如何解决我的问题?

更新

我重新设计了我的存储库类,所以现在需要一个 TEntity A TEntityBase, , 在哪里 TEntity 是实体的实际类型,并且 TEntityBase 是我试图投射到的界面。重要的是,我现在有以下内容 where 我的类定义中的子句:

where TEntity : class, TEntityBase

这允许我存储我的 Table 财产作为 Table<TEntity> 而不是 ITable, ,这允许我使用 AsEnumerable() (正如斯蒂芬建议的那样)。这是修改后的方法:

public IEnumerable<TEntityBase> GetAll()
{
    return Table.AsEnumerable().Select(e => (TEntityBase)e);
}

到目前为止,那 似乎 来做到这一点。

有帮助吗?

解决方案

这听起来像是一个错误,但要明白实现 LINQ 提供程序绝对是一项巨大的努力。即使(Microsoft 的)LINQ to SQL 和 LINQ to Entities 对于它们支持或不支持的 LINQ 查询/操作也有自己的限制。

如果返回 IEnumerable<T> 是可以接受的,那么你可以解决缺乏支持的问题 Queryable.Cast 通过致电 AsEnumerable 打电话之前 Cast. 。但是,这限制了 DAL 的使用方式:自从 IQueryable<T> 不再返回,进一步查询(例如, Where 子句)不会传递到数据库层。

其他提示

我同意这听起来像是一个错误。您可以尝试以下操作,它会做同样的事情

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

您可能需要添加一个 where :ITable 也是方法定义。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top