2011-08-23 5 views
0

私は一部にガイドとしてthis役立つ記事を使用して、コンパイルクエリにSQLにいくつかの既存のLINQを転換に取り組んでいます。以下は 通常とコンパイルされたLinqとSQLとの等価性?

は私の元の文のうちの一つの例である:

private IQueryable<Widget> GetWidgetQuery() 
    { 
     return db.Widgets.Where(u => (!u.SomeField.HasValue || !u.SomeField.Value)); 
    } 

ここでコンパイルされたクエリの作成で私の試みです:

private static readonly Func<DBDataContext, IQueryable<Widget>> GetWidgetQuery = 
     CompiledQuery.Compile((DBDataContext db) => 
     db.Widgets.Where(u => (!u.SomeField.HasValue || !u.SomeField.Value))); 

私は標準の違いを視覚化するいくつかの問題を抱えているが、このクエリのインカネーションをコンパイルします。私の構文が適切であると仮定すると、コンパイルされたクエリは、コンパイルされたクエリを使用する利点だけで、標準のものと同じデータを返しますか?

答えて

1

はい、IQueryable <ウィジェット>オブジェクトを返しますが、最初の例とは異なり、クエリをさらに拡張すると、コンパイルされたクエリの利点が失われます。

GetWidgetQuery()を呼び出すときにDBDataContextオブジェクトを渡す必要があります。

DBDataContext db; 

戻り値のIQueryable <ウィジェット>:あり

var widgetsUncompiled = GetWidgetQuery(db).Where(u => u.SomeField.HasValue); 
1

SQLにLINQで
var widgets = GetWidgetQuery(db); 

が、これは結果にLINQクエリを実行することにより、コンパイルされたクエリの利益を失いますLINQ-to-SQLのコンパイルされたクエリとコンパイルされていないクエリの違いです。コンパイルされたクエリは、IQueryableをただ停止している場合でもすぐに実行されます。これに関する私の質問をチェックして、関連するかもしれないLINQ to SQL *compiled* queries and when they execute