2

SQLiteデータベースでDbLinqを使用しようとしていますが、をITableとしてキャストしようとすると問題が発生しQueryable<TEntity>ます。

DbLinq(Issue 211)に既知のバグがあり、これが私の問題の原因である可能性がありますが、コードが正常であることを確認し、健全である場合は、回避できることがあるかどうかを確認したいと思いました。不具合。

キャストを実行しようとする一般的なリポジトリメソッドは次のとおりです。

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

これはコンパイルされますが、のインターフェイスを渡しIPersonTEntityテーブル内のエンティティのタイプがPerson(where Person : IPerson)の場合、DbLinqから次のエラーが発生します。

S0133:QueryMethodQueryable.Castを実装します。

なぜ私はこれをしようとしているのですか?

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

質問:

  1. 私は不可能なキャストを試みていますか、それともこれは間違いなくDbLinqのバグですか?
  2. 他にどのように問題を解決することができますか?

アップデート

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

そしてこれまでのところ、それでうまくいくようです。

4

2 に答える 2

2

バグのように聞こえますが、LINQプロバイダーの実装は非常に大きな努力であることを理解してください。(Microsoftの)LINQtoSQLおよびLINQtoEntitiesでさえ、サポートするまたはサポートしないLINQクエリ/操作に独自の制限があります。

返品が許容される場合は、を呼び出す前に呼び出すIEnumerable<T>ことで、サポートの欠如を回避できます。ただし、これによりDALの使用方法が制限されます。が返されないため、それ以上のクエリ(句など)はDBレイヤーに渡されません。Queryable.CastAsEnumerableCastIQueryable<T>Where

于 2010-05-12T19:23:48.543 に答える
2

私はそれがバグのように聞こえることに同意します。あなたは同じことをする次のことを試すことができます

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

where:ITableをメソッド定義にも追加する必要があるかもしれません。

于 2010-05-12T19:51:11.227 に答える