2011-01-03 44 views
1

私は動的LINQおよび述語ビルダーを読んでいます。私は少し不明で、バックエンドロジスティクスのいくつかについてちょっと混乱しています。私は厄介なgroupwise-maxクエリを含む、自分のアプリケーションの1つに対してレポート/高度な検索オプションを提供しようとしています。動的LINQ - 動的、サーバー側Where句

私は簡単に結果をプログラムでフィルタリングすることができますが、パフォーマンス上の理由から、SQL Serverではwhere節が実行され、.netコードでは実行されません。どのソリューションが実際にSQLの述語を実行し、クライアント/ .NETの側を実行するのかは不明です。ここでは、LINQで何をしたいのかの例を示します。

from fbd in db.FooBarDatas 
join max_fbd in 
    (from fbd in db.FooBarDatas 
    group fbd by new { fbd.FooID, fbd.BarID } into grp 
    select new { MaxFooBarDataID = grp.Max(fbd => fbd.FooBarDataID } 
    ) 
on fbd.FooBarDataID equals max_fbd.MaxFooBarDataID 
select new 
{ 
    FooBarDataID = fbd.FooBarDataID, 
    NormalizedPropertyName1 = fbd.Column1, 
    NormalizedPropertyName2 = fbd.Column2, 
    NormalizedPropertyName3 = fbd.Column3, 
    etc... 
} 

これは私の基本的な質問です。私は、クエリから動的に取得したいデータの多くが外部テーブルから来ているため、それらをすべて直接的なプロパティとして参照させたいので、最終的に汎用リンクデータオブジェクトにすべてをスローします。

ここで、意味のあるレポートを生成するために、このクエリに「where」節条件を一括して追加する方法が必要です。 "where"節は、ユーザーが指定したパラメーターによって異なります。レコードセットはかなり大きいので、私はSQL側でフィルタリングを行う方法を探しています。

これを達成する方法の簡単な例は誰でも提供できますか?助けを前にありがとう。

答えて

1

私は、奇妙な記事タイトルに出会った後に答えを見つけたと思います。

http://www.weirdlover.com/2010/05/11/iqueryable-can-kill-your-dog-steal-your-wife-kill-your-will-to-live-etc/

イテレータが要求されるまでのIQueryableは、実際に、実際のTSQLコンパイルのいずれかの種類を行っていないようです。ここでは、非常に単純な例を示します。

// this does not actually call a TSQL query 
IQueryable<FooBar> q = (from fb in db.FooBars select fb); 
// this line still does not call a TSQL query 
q = q.Where(fb => fb.FooID == 3); 
// this line still does not call a TSQL query 
q = q.Where(fb => fb.BarID == 74) 
// this line finally compiles a TSQL statement, calls the query, and 
// gathers the results: 
List<FooBar> results = q.ToList(); 

IQueryableオブジェクトは、オンデマンドの評価オブジェクトです。それを試してみたところ、UDFのかなり複雑な文が、ほぼ即座に戻ってきていることがわかりました。これとサーバー側のフィルタリングの違いを説明するが、ここで見つけることができます別の記事:

http://www.sellsbrothers.com/posts/details/12614

私はこれは私がやっていた何をしようとして他の誰に役立つことを願っています。