我正在尝试使用 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)
真实的值。
我应该在'squery
之后做其他事情吗?if
foreach
编辑
我改用了谓词构建器,当我使用(根据编辑的代码)时,它似乎(有点)工作predicate.Or
,但它只返回我选择的第一个选项,而不是构建表达式树。我认为更改predicate.Or
为predicate.And
会将每个选定的用户输入添加到过滤器表达式中。
如果用户选择了所有三个选项,我希望只返回 HasBackGarden、HasFrontGarden 和 HasSecureParking 列为 true 的行。我该如何做到这一点?