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)真实的值。

我应该在'squery之后做其他事情吗?ifforeach

编辑

我改用了谓词构建器,当我使用(根据编辑的代码)时,它似乎(有点)工作predicate.Or,但它只返回我选择的第一个选项,而不是构建表达式树。我认为更改predicate.Orpredicate.And会将每个选定的用户输入添加到过滤器表达式中。

如果用户选择了所有三个选项,我希望只返回 HasBackGarden、HasFrontGarden 和 HasSecureParking 列为 true 的行。我该如何做到这一点?

4

2 回答 2

3

如果您想将结果集限制为满足所有条件的记录,那么您应该使用.And而不是正确的.Or,但为了做到这一点,您需要从PredicateBuilder.True<ResidentialProperty>()代替开始False

这是因为在添加任何过滤器之前,正确的结果集包含所有记录,并且每个后续过滤器都会限制结果集。如果以 开头False,则没有任何记录可能满足谓词。

于 2013-02-20T17:46:03.177 回答
1

从您的代码看来,您正在对一个空的可枚举变量“查询”进行操作。请记住,您所说的查询是数据集,而 Where 语句是对该数据集的查询。因此,第一个查询是针对空数据集的,看起来来自 foreach 的其他查询只会优化该空集。

此外,您可以只做 .Where(q => q.HasWhatever) 因为这些是布尔值。

于 2013-02-20T17:00:50.937 回答