2016-10-23 6 views
0

ベースクエリで1つ以上の列を検索するフィルタを作成しようとしています。それは問題は、質問がレンダリングされ、検索がコード(MSSQLではなく)を介して実行されているため、最適ではないことを100%確信していることです。linq toエンティティ式ツリー匿名型の場合

私の質問は次のとおりです。 (それに精通していない)ので、クエリはdb側が生成されますか?

p.s:私は、動的LINQ

はありがとうござい使用したくありません!

var basequery = (from x in db.table1 
          join x1 in db.table2 on x.id equals x1.someid 
          where x.deleted != null && x.moreCondition = "blah" 
          select new { 
           x.field1, 
           x.fiedl2 
           x2.field1, 
           x2.field3 
          }); 

各列を検索するために、ベースクエリにフィルタを適用します。

foreach (var item in Columns) 
{ 

    basequery = basequery.AsEnumerable() 
    .Where(i => (i.GetType().GetProperty(item.Data) 
     .GetValue(i, null) ?? string.Empty).ToString().ToUpper().Contains(item.Search.Value.ToUpper())).AsQueryable(); 
} 
+0

これは私が必要なものです:[http://stackoverflow.com/questions/931444/trying-to-develop-a-new-extension-method](http://stackoverflow.com/questions/931444/trying-to-新しい拡張方法を開発する) – Zulander

答えて

1

あなたは列のリストに基づいて、フィルタ述語を組み合わせて、あなたの式ツリーを構築する必要があります。しかし、提示したようにするのではなく、マテリアライゼーション方法の1つが使用されるまで、マテリアライズされないフィルタ式を作成する必要があります。

ここでは、動的なクエリを構築するために、式ツリーを使用する方法の素敵な例があります:https://msdn.microsoft.com/en-us/library/mt654267.aspx

そして、あなたは、いくつかの既製のソリューションを取得したい場合は、ここで説明したように、ちょうどPredicateBuilderを試してみてください。 http://www.albahari.com/nutshell/predicatebuilder.aspx

関連する問題