2011-11-15 11 views
1

条件を単一の式オブジェクトに動的に追加し、その式オブジェクトを使用するメソッドにその式オブジェクトを渡そうとしています。しかし、私は "クラス名はこの時点で利用できません"と続けています。動的節をLinq式として作成する

ありがとうございます!

UPDATE:
私は最終的にworking example hereを作成することができました。

コードのように見える:

var view = new vw_QuickFindResult(); 

    // This wont compile 
    Expression<Func<vw_QuickFindResult, bool>> where = Expression<Func<vw_QuickFindResult, bool>>(view, true); 

    // Build LIKE Statement 
    var searches = new List<String>(searchText.Split(' ')); 
    searches.ForEach(productName => 
    { 
     productName.Replace('"', '%'); 
     productName.Replace('*', '%'); 
     where = x => SqlMethods.Like(view.DocumentName, productName); 
    }); 

    return DocumentCollectionService.ListQuickFind(where); 

答えて

3

これは、1つの問題は次のとおりです。

where = x => SqlMethods.Like(view.DocumentName, productName); 

あなたが代わりにあなただけ初期化されてきたviewを使用して、ここでxを無視しています。私はあなたが欲しい疑う:

where = x => SqlMethods.Like(x.DocumentName, productName); 

しかし 既存 where表現たびに置き換えること。私はあなたがJoe Albhariによって PredicateBuilderを使用するべきだと思います。私は個人的には、あまりにも ForEachを使用しないようしたい:

var where = PredicateBuilder.False<vw_QuickFindResult>(); 

// Build LIKE Statement 
foreach (string productName in searchText.Split(' ')) 
{ 
    string like = productName.Replace('"', '%'); 
          .Replace('*', '%'); 
    where = where.Or(x => SqlMethods.Like(view.DocumentName, like)); 
} 

return DocumentCollectionService.ListQuickFind(where); 

(私はあなたが欲しい機能に推測している。あなたの代わりにPredicateBuilder.TrueAnd拡張メソッドをしたいことがあります。)

+0

これは素晴らしいです!質問:動的OrderByを作成したい場合はどうなりますか? –

+0

@PrisonerZERO:これは難しくなります。ターゲットプロパティタイプも同様に並べ替える必要があります。注文の固定セットがあるほとんどの場合、私はスイッチステートメントがそれらを達成する最も簡単な方法だと考えています。 –

+0

ありがとう!私はLinq-To_SQLを完全に新しくしています。これは本当にたくさんの時間を節約しました。 –

関連する問題