gpt4 book ai didi

c# - 你如何将 LinqToSql Table 转换为 Table 其中 TEntity : IEntity?

转载 作者:行者123 更新时间:2023-11-30 21:21:19 28 4
gpt4 key购买 nike

我正在尝试将 DbLinq 与 SQLite 数据库一起使用,但在尝试转换 ITable 时遇到了问题作为Queryable<TEntity> .

在 DbLinq ( Issue 211 ) 中有一个已知的错误,这可能是我的问题的根源,但我想确保我的代码是正确的,如果是的话,看看我是否可以做些什么解决该错误。

这是尝试进行转换的通用存储库方法:

public IQueryable<TEntity> GetAll()
{
return Table.Cast<TEntity>(); // Table is an ITable
}

这会编译,但如果我传入接口(interface) IPerson对于 TEntity并且表中实体的类型是 Person (其中 Person : IPerson ),我从 DbLinq 收到此错误:

S0133: Implement QueryMethod Queryable.Cast.

我为什么要这样做?

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

问题:

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

更新

我修改了我的存储库类,所以它现在需要一个 TEntity 一个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 提供程序绝对是一项艰巨的任务。甚至(微软的)LINQ to SQL 和 LINQ to Entities 对它们支持或不支持的 LINQ 查询/操作都有自己的限制。

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

关于c# - 你如何将 LinqToSql Table<TEntity> 转换为 Table<IEntity> 其中 TEntity : IEntity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2821935/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com