代码之家  ›  专栏  ›  技术社区  ›  devuxer

如何将LinqToSQL表<tenty>转换为表<ientity>where tenty:ientity?

  •  2
  • devuxer  · 技术社区  · 15 年前

    我正在尝试将dblinq与sqlite数据库一起使用,但当我尝试强制转换 ITable 作为一个 Queryable<TEntity> .

    dblinq中存在已知的错误( Issue 211 ,这可能是我的问题的根源,但我想确保我的代码是健全的,如果是的话,找出我是否可以做些什么来解决这个bug。

    下面是尝试执行转换的通用存储库方法:

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

    它编译,但如果我传入接口 IPerson 对于 TEntity 表中的实体类型为 Person (何处) Person : IPerson ,我从dblinq得到这个错误:

    S0133:实现querymethod queryable.cast。

    我为什么要这么做?

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

    问题:

    1. 我是在尝试一个不可能的演员,还是这绝对是DBLinq中的一个bug?
    2. 我还能怎么解决我的问题呢?

    更新

    我修改了我的知识库类,所以现在它需要 柔韧性 TEntityBase 在哪里 柔韧性 是实体的实际类型,并且 张力基 是我试图转换到的接口。重要的是,我现在有以下内容 where 类定义中的子句:

    where TEntity : class, TEntityBase
    

    这让我可以存储 Table 属性作为 Table<TEntity> 而不是 可得的 允许我使用 AsEnumerable() (正如斯蒂芬建议的那样)。修订方法如下:

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

    到目前为止, 似乎 做这个把戏。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Stephen Cleary    15 年前

    这听起来像一个bug,但是要理解实现一个LINQ提供者是一项绝对巨大的努力。甚至(微软的)linq-to-sql和linq-to实体也对它们支持或不支持的linq查询/操作有自己的限制。

    如果返回 IEnumerable<T> 是可以接受的,那么你可以在缺乏支持的情况下 Queryable.Cast 通过呼叫 AsEnumerable 打电话之前 Cast . 但是,这限制了如何使用DAL:因为 IQueryable<T> 不再返回,进一步查询(例如, Where 子句)不会传递到DB层。

        2
  •  2
  •   Coding Flow    15 年前

    我同意这听起来像个虫子。你可以试试下面的方法,它也可以做同样的事情

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

    您可能还需要向方法定义添加一个where:itable。