0

「実際の」Linq2Entityプロバイダーと同じように式を検証IObjectSet<T>できるようにするには、実装が必要です。出来ますか?

背景:
EF モデル (モデルファースト) をIObjectSet<T>代わりに返すように変更したObjectSet<T>
ので、モデルを偽造して、必要なデータを返すことができます。

問題:基本的に のラッパーである
の実装を書きました。 これで問題ありません、LinqToObject を使用して imの実装をクエリすると、 Linq2Entity 式が有効であるという保証はありません。IObejctSet<T>List<T>
IObjectSet<T>

提案された解決策
私の実装では、実際List<T>のプロバイダーを使用するだけです:

private class IObjectSetUnitTestImplementation<T> : IObjectSet<T> where T : EntityObject
{
  private IQueryable _qry;

  public IObjectSetUnitTestImplementation(List<T> lst)
  {
    _inner = lst;
    _qry = _inner.AsQueryable();
    Expression = _qry.Expression;
    ElementType = _qry.ElementType;
    Provider = _qry.Provider; //<--should be ObjectSet<T>'s provider
  }
  //Rest of implementaion omitted
}

だから私はこれを試しました:

ObjectContext context = null;
var _qry = new ObjectQuery<T>(typeof(T).Name, context) as IQueryable;
Expression = _qry.Expression;
ElementType = _qry.ElementType;
Provider = _qry.Provider;

しかし、それをフィードするコンテキストがありません。たとえあったとしても、データベースにアクセスしようとするだけです。

他に方法はありますか?

4

1 に答える 1

1

したがって、Linq2Entity 式が有効であるという保証はありません」

おめでとうございます。に を実装してはならない理由、理由などをIObjectSet<T>発見しました。理由は簡単です。ある LINQ プロバイダーで有効なクエリが、別のプロバイダーでは無効になる可能性があります (データベースを MS SQL から別のものに変更しただけでも)。IRepository<T>IQyeryable<T>

そして、これらのクエリを確認する一般的な方法はありません。
したがって、単体テストは には適していませんIQyeryable<T>が、統合テストは間違いなく必要なものです。

于 2013-10-11T09:40:44.420 に答える