LinqToSql Table<TEntity> を Table<IEntity> としてキャストするにはどうすればよいですか。 ここで、 TEntity は次のとおりです。エンティティ?
-
26-09-2019 - |
質問
SQLite データベースで DbLinq を使用しようとしていますが、キャストしようとすると問題が発生します。 ITable
として Queryable<TEntity>
.
DbLinq には既知のバグがあります (第211号)、これが問題の原因である可能性がありますが、コードが正常であることを確認し、正常である場合は、バグを回避するために何かできるかどうかを調べたかったのです。
キャストを試行する汎用リポジトリ メソッドは次のとおりです。
public IQueryable<TEntity> GetAll()
{
return Table.Cast<TEntity>(); // Table is an ITable
}
これはコンパイルされますが、インターフェイスに渡すと IPerson
のために TEntity
テーブル内のエンティティのタイプは次のとおりです。 Person
(どこ Person : IPerson
)、DbLinq から次のエラーが発生します。
S0133:QueryMethod Queryable.Cast を実装します。
なぜ私はこれをやろうとしているのでしょうか?
実行時までエンティティの型がわからないライブラリ プロジェクトがありますが、エンティティのインターフェイスはわかっています。そこで、ライブラリ プロジェクトがデータを消費できるように、インターフェイス型にキャストしようとしています。
質問:
- 不可能なキャストを試みているのでしょうか、それともこれは明らかに DbLinq のバグなのでしょうか?
- 他にどうすれば問題を解決できるでしょうか?
アップデート
リポジトリ クラスを作り直したので、 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プロバイダを実装する絶対的に巨大な努力であることを理解しています。でも、エンティティへのSQLとLINQに(Microsoftの)LINQは、正確には、サポートまたはサポートしないLINQクエリ/操作に、独自の制限があります。
帰国IEnumerable<T>
が許容される場合は、、あなたはQueryable.Cast
を呼び出す前にAsEnumerable
を呼び出すことにより、Cast
のサポートの欠如を回避することができます。しかし、あなたのDALは使用できませんどのようにこの制限していますIQueryable<T>
は、もはや返され、さらにクエリ(例えば、Where
節)であることからは、DB層に渡されることはありません。
他のヒント
私はそれはバグのように聞こえる同意するものとします。あなたは同じことをします、次の
を試みることができますreturn Table.Select<TEntity>(tbl => (TEntity)tbl)
あなたはどこの追加が必要になる場合があります:。だけでなく、メソッド定義にのITableを