1

LinqPad を使用して基本的な動的 Linq クエリを作成しようとしています。私の方法では、ユーザーに 1 ~ 3 つのオプションを選択するように求め、入力に基づいて動的にクエリを作成します。

public void FilteredPropertySearch()
{
    bool addAnotherOption = true;
    int option;
    Dictionary<int, bool> parameters = new Dictionary<int, bool>();
    var predicate = PredicateBuilder.False<ResidentialProperty>();

    Console.WriteLine("Follow instructions to filter property search results");

do
{
    // get user input

    option = int.Parse(Console.ReadLine());

    switch(option)
    {
        case 1:
            parameters.Add(1, true);
            break;

    // more cases - when case 0 addAnotherOption = false, loop ends

        default:
            Console.WriteLine("That was not a valid option");
            break;
    }

}while(addAnotherOption == true);

    foreach(KeyValuePair<int, bool> p in parameters)
{   
    if(p.Key == 1 && p.Value == true)
        predicate = predicate.Or (c => c.HasBackGarden);
    if(p.Key == 2 && p.Value == true)
        predicate = predicate.Or (c => c.HasFrontGarden);
    if(p.Key == 3 && p.Value == true)
        predicate = predicate.Or (c => c.HasSecureParking);
}

ResidentialProperties.Where (predicate).Dump();

}

ループはユーザーのforeach入力に基づいてクエリを作成する必要がありますが、たとえば、辞書の最初の値を true にして他の値を選択しないと、結果が返されません。私が知っているように、データベーステーブルにKey(1)は真であることを満たす値がいくつかあります。

の のquery後 で何か他のことをする必要がありますか?ifforeach

編集

代わりに述語ビルダーを使用しましたが、(編集されたコードに従って)使用すると(一種の)機能しているように見えpredicate.Orますが、選択した最初のオプションのみを返し、式ツリーを構築していません。predicate.Orに変更するpredicate.Andと、選択した各ユーザー入力がフィルター式に追加されると思いました。

ユーザーが 3 つのオプションをすべて選択した場合、HasBackGarden、HasFrontGarden、および HasSecureParking 列が true である行のみが返されるようにします。どうすればこれを達成できますか?

4

2 に答える 2