SQLiteデータベースでDbLinqを使用しようとしていますが、をITable
としてキャストしようとすると問題が発生しQueryable<TEntity>
ます。
DbLinq(Issue 211)に既知のバグがあり、これが私の問題の原因である可能性がありますが、コードが正常であることを確認し、健全である場合は、回避できることがあるかどうかを確認したいと思いました。不具合。
キャストを実行しようとする一般的なリポジトリメソッドは次のとおりです。
public IQueryable<TEntity> GetAll()
{
return Table.Cast<TEntity>(); // Table is an ITable
}
これはコンパイルされますが、のインターフェイスを渡しIPerson
、TEntity
テーブル内のエンティティのタイプがPerson
(where Person : IPerson
)の場合、DbLinqから次のエラーが発生します。
S0133:QueryMethodQueryable.Castを実装します。
なぜ私はこれをしようとしているのですか?
実行時までエンティティのタイプを知らないライブラリプロジェクトがありますが、エンティティのインターフェイスは知っています。そのため、ライブラリプロジェクトがデータを消費できるように、インターフェイスタイプにキャストしようとしています。
質問:
- 私は不可能なキャストを試みていますか、それともこれは間違いなくDbLinqのバグですか?
- 他にどのように問題を解決することができますか?
アップデート
リポジトリクラスを作り直したので、TEntity
とが必要になりますTEntityBase
。ここTEntity
で、はエンティティの実際のタイプであり、TEntityBase
キャストしようとしているインターフェイスです。重要なのはwhere
、クラス定義に次の句があることです。
where TEntity : class, TEntityBase
Table
これにより、プロパティをのTable<TEntity>
代わりに保存できるようになり、 (Stephenが提案したように)ITable
使用できるようになります。AsEnumerable()
改訂された方法は次のとおりです。
public IEnumerable<TEntityBase> GetAll()
{
return Table.AsEnumerable().Select(e => (TEntityBase)e);
}
そしてこれまでのところ、それでうまくいくようです。