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
後 で何か他のことをする必要がありますか?if
foreach
編集
代わりに述語ビルダーを使用しましたが、(編集されたコードに従って)使用すると(一種の)機能しているように見えpredicate.Or
ますが、選択した最初のオプションのみを返し、式ツリーを構築していません。predicate.Or
に変更するpredicate.And
と、選択した各ユーザー入力がフィルター式に追加されると思いました。
ユーザーが 3 つのオプションをすべて選択した場合、HasBackGarden、HasFrontGarden、および HasSecureParking 列が true である行のみが返されるようにします。どうすればこれを達成できますか?