如何将LinqToSql表<tentity>转换为表<ientity>,其中TEntity:IEntity?</ientity> </tentity>

时间:2010-05-12 19:06:31

标签: 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
}

这是编译,但如果我传入IPerson的{​​{1}}接口,表格中的实体类型为TEntity(其中Person),我'从DbLinq收到此错误:

  

S0133:实施QueryMethod Queryable.Cast。

为什么我要尝试这样做?

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

问题:

  1. 我是否尝试过一次不可能的演员,或者这绝对是DbLinq中的一个错误?
  2. 我还能怎样解决我的问题?
  3. 更新

    我重新设计了我的存储库类,所以它现在需要Person : IPerson 一个TEntity,其中TEntityBase是实体的实际类型,{{{ 1}}是我试图强制转换的界面。重要的是,我现在在我的类定义中有以下TEntity子句:

    TEntityBase

    这允许我将where属性存储为where TEntity : class, TEntityBase 而不是Table,这样我就可以使用Table<TEntity>(正如Stephen建议的那样)。以下是修订后的方法:

    ITable

    到目前为止,似乎来做这个伎俩。

2 个答案:

答案 0 :(得分:2)

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

如果可以接受返回IEnumerable<T>,则可以在致电Queryable.Cast之前致电AsEnumerable,以解决对Cast缺乏支持的问题。但是,这限制了您的DAL的使用方式:由于不再返回IQueryable<T>,因此不会将其他查询(例如Where子句)传递给数据库图层。

答案 1 :(得分:2)

我同意这听起来像个错误。您可以尝试以下哪些操作

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

您可能必须添加where:ITable也适用于方法定义。