10

これについて専門家のアドバイスが欲しいです。以前にコンパイル済みクエリを使用したことがありますが、この特定のケースでは、それが適切かどうかわかりません。

これは、クエリが変化し、検索対象に依存する検索フォームです。

static Func<DBContext, int, IQueryable<Foo>> Search = CompiledQuery.Compile(
    (DBContext db, int ID) =>
        db.Person
            .Where(w => w.LocationID = ID)
            .Select(s => 
                new Foo 
                { 
                    Name = s.PersonName, 
                    Age = s.Age,
                    Location = s.LocationName,
                    Kin = s.Kin
                }));

誰かが検索ボックスに入力した場合、クエリに別のWhereステートメントを追加してクエリを拡張したいと思います。

var query = Search(context, 123);
query = query.Where(w => w.Name.Contains(searchString));

だから私の質問は、すべての結果を返し、結果の一致LocationID == 123をチェックしていますか? searchStringそれとも、実際にコンパイルされたクエリを拡張していますか?

それが前者の場合(私はそうであると思われます)、を破棄しCompiledQueryて、クエリを拡張するメソッドを作成し、それをリストとして返す必要がありますか?

また、使用のベスト プラクティスCompiledQueryとはどのような場合に使用すべきかについてのガイドラインはありますか?

注:Linq to SQLを使用してASP.NET Webサイトで上記を使用しています。それが違いを生むかどうかはわかりません。

ありがとう

4

4 に答える 4

3

問題は、コンパイルされたクエリが固定されていることです。データベースに対して実行する SQL を認識しています。ただし、ラムダ式は遅延ロードされ、実行時に実行されるため、コンパイル クエリを変更できません。悪いニュースは、データベースからすべてのレコードを返すことですが、メモリ内のそれらのレコードをクエリしてさらに絞り込むことです。

クエリをコンパイルする場合は、署名の異なる 2 つのクエリを作成することをお勧めします。

于 2011-09-22T19:21:39.797 に答える
0

コンパイルされたクエリに追加の条件を含めるだけです。

DB.Person.Where(w => w.LocationID == ID 
                     & (searchString=="" || w.Name.Contains(searchString)))
于 2011-09-22T05:21:39.430 に答える
0

私が正しければ、linq に動的な where 句が必要です。そのためには、この方法をお勧めします

IEnumerable list;

if(condition1)
{
  list = Linq Statement;
}

if(condition2)
{
  list = from f in list where con1=con && con2=con select f;
}

if(condition3)
{
 list = from n in list  con1=con && con2=con select f;
}

あなたが私の言葉を得たことを願っています。

于 2011-09-22T17:42:41.803 に答える
0

私の知る限り、クエリを一度コンパイルすることをお勧めします。これがプリコンパイルされたクエリの要点です(そのため、プリコンパイルされたクエリは静的です)。そのクエリを SQL にコンパイルする時間を節約できます。事前にコンパイルされたクエリを拡張すると、そのクエリが再度コンパイルされ、利益が失われます。

結果に対するクエリ結果 (クエリ変数) は、もはや LINQ to SQL ではありません。

于 2011-09-22T03:40:00.380 に答える