LinqToSql Table<TEntity> を Table<IEntity> としてキャストするにはどうすればよいですか。 ここで、 TEntity は次のとおりです。エンティティ?

StackOverflow https://stackoverflow.com/questions/2821935

質問

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 を実装します。

なぜ私はこれをやろうとしているのでしょうか?

実行時までエンティティの型がわからないライブラリ プロジェクトがありますが、エンティティのインターフェイスはわかっています。そこで、ライブラリ プロジェクトがデータを消費できるように、インターフェイス型にキャストしようとしています。

質問:

  1. 不可能なキャストを試みているのでしょうか、それともこれは明らかに DbLinq のバグなのでしょうか?
  2. 他にどうすれば問題を解決できるでしょうか?

アップデート

リポジトリ クラスを作り直したので、 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を

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top