2011-07-22 12 views
1
public class Command 
{ 
    public int CommandId { get; set; } 
    public string Title { get; set; } 
    public virtual ICollection<CommandPart> CommandParts { get; set; } 
} 

public class CommandPart 
{ 
    public int CommandPartID { get; set; } 
    public string part { get; set; } 
    public virtual ICollection<Command> command { get; set; } 
} 

public ViewResult Filter(string myString) 
{ 
    var foo = myString.Split(Convert.ToChar("+")); 
    var a = foo[0]; 
    var b = foo[1]; 

    var query = 
    db.Commands.Where(
     c => 
     c.CommandParts.Any(p => p.part == a) 
     && (c.CommandParts.Any(p2 => p2.part == b))).ToList(); 

    return View(query.ToList()); 
} 

上記のクエリは、fooに正確に2つの項目がある場合に期待通りに機能します。私は、クエリを作成するためにfooをループすることができるようにしたいと思います。これは私の試みですが、動作しません。実行時にLINQを生成するパラメータをループする

これはEntity Frameworkを使用したASP.NET MVC3プロジェクトです。実行時に生成されるようにクエリを書く方法はありますか?

+0

[動的に述語を作成する](http://stackoverflow.com/questions/6383825/how-to-create-predicate-dynamically/6383937#6383937) – Eranga

答えて

3

PredicateBuilderをご覧ください。これは、あなたがWhere述語句を動的に構築できるようにする、いくつかのLINQ式をカプセル化する小さなヘルパークラスです。あなたはANDとOR節を一緒に使うことができ、それらをかなり深く入れ子にすることができます。

は、だから、この(擬似コード)のような何かができる:

var predicate = PredicateBuilder.True<Command>(); //use True for ANDs 
foreach(var keyword in foo) { 
    predicate = predicate.And(c => c.CommandParts.Any(p => p.part==keyword)); 
} 
var results = db.Commands.Where(predicate); 
私はあなたがダウンロードすることができLINQKit(NuGetをダウンロードする必要がありますので、あなたも、EFを使用していることを見逃し

)、その 'AsExandable'拡張子を使用します。これについては、PredicateBuilderのページを参照してください(途中まで)。

希望すると便利です。

+0

ありがとう、@ david-hoersterそれはトリックでした。私は、foreachループ内の文字列変数にキーワードを割り当ててから、その変数を述部作成ステートメントに代入する必要がありました。私はそれがなぜ機能するのか理解できず、フォローアップの質問を投稿するでしょう。 –

+0

うれしい私は助けることができました。キーワードを一時変数に割り当てることは、私が忘れたものです。述語は即座に評価されません...反復されたときのみ、キーワードの値はコピーされません。キーワードへの参照のみ。 linqの遅延実行を参照してください。それはそれを説明する必要があります。 –

関連する問題