6

例えば:-

// This one will be converted to SQL no problem
Expression<Func<Foo, bool>> predicate = x => x.Name = "Foo";

// This one will throw a NotSupportedException because the QueryProvider
// doesn't support reference comparisons
Expression<Func<Foo, bool>> predicate = x => x == someOtherFoo;

// This one doesn't work because the query provider can't
// handle IsAwesome()
Expression<Func<Foo, bool>> predicate = x => x.IsAwesome();

理想的には、データベースから分離された自動テストで、実行前にこれをテストする方法を探しています。

私は自分の QueryProvider をインスタンス化する方法を見つけるために MSDN をトロールするのに時間を費やしましたが、私の Google-fu は今日私を失敗させているようです.

前もって感謝します!

4

1 に答える 1

4

これを行うにはモデルが必要ですが、データベースは必要ありません。モデルは EDMX として作成できますが、おそらく Code First を使用する方が簡単です。Code First モデルの作成または使用にデータベース接続が不要であることを確認するには、Code First が通常データベースから取得する情報を提供する必要があります。この投稿http://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/は、DbModelBuilder を使用してこれを行う方法と、モデルから DbContext を作成する方法を示しています。次のようなコードになります。

var modelBuilder = new DbModelBuilder();
modelBuilder.Entity<Foo>();
var model = modelBuilder.Build(
                new DbProviderInfo("System.Data.SqlClient", "2008")).Compile();

おそらく、異なるテストごとにモデル オブジェクトを再作成するのではなく、モデル オブジェクトをキャッシュすることをお勧めします。

また、DbContext がデータベースに接続しようとするのを防ぐために、データベース初期化子を無効にする必要があります。たとえば、コンテキストを使用する前に、次のように呼び出します。

Database.SetInitializer<FooContext>(null);

これで、任意のクエリで ToString を使用して、生成される SQL を確認できます。LINQ が式を処理できない場合は、例外が発生します。たとえば、これはクエリを出力します。

using (var context = new FooContext(model))
{
    Expression<Func<Foo, bool>> predicate = x => x.Name == "Foo";

    Console.WriteLine(context.Foos.Where(predicate));
}

これはスローします:

using (var context = new FooContext(model))
{
    var someOtherFoo = new Foo();
    Expression<Func<Foo, bool>> predicate = x => x == someOtherFoo;

    Console.WriteLine(context.Foos.Where(predicate));
}

明らかに、テストを作成している場合は、コンソールに出力するだけでなく、何らかのアサーション/チェックを実行します。

于 2012-10-25T16:11:50.643 に答える