c# - 如何将 LinqToSql Table<TEntity> 转换为 Table<IEntity> where TEntity : IEntity?

标签 c# linq-to-sql generics dblinq

我正在尝试将 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属性(property)作为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 子句)将不会传递到数据库层。

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

相关文章:

c# - 如何从声明为 IEnumerable<T> 的方法/属性安全地返回 List<T>?

C# Switch 语句重构

sql-server - 如何确定 LINQ to SQL 结果集的大小(以字节为单位)

c# - 如何让列在 Self-Relation 表中接受空值作为零 (0)

c# - 为什么 IList<T> 不提供 List<T> 提供的所有方法?我应该使用哪个?

c# - 如何在单元测试中模拟 RestSharp 可移植库

c# MailMessage 对象问题

linq - Entity Framework LINQ 多列计数(不同)

java - 抽象类泛型通过构造函数继承

java - 分配给多级通配符