1

我有一个Dictionary<string,object>search terms and values在这种情况下termkey. 一个例子是:

var args = new Dictionary<string,object>() {{"name","joe"},
                                            {"occupation","salesman"}};

我正在使用PredicateBuilder来构建Where子句并且它可以工作,但我想知道是否有更简洁的方法来做到这一点,而不是Dictionary必须调用? 这就是我现在的做法:if(args.ContainsKey(...)search termDictionary

List<Person> persons;
var predicate = PredicateBuilder.False<Person>();

if (args.ContainsKey("name"))
{
    string name = args["name"].ToString();
    predicate = predicate.Or(x => x.name == name);
}


if (args.ContainsKey("name"))
{
    string age = args["age"].ToString();
    predicate = predicate.Or(x => x.age == age);
}

persons = _context.Persons.AsExpandable().Where(predicate).ToList();

另外,如果我在 , 之外声明,string name但在这种情况下有关系吗?例如if blockresharperAccess to modified closure

string name;

if (args.ContainsKey("name"))
{
    name = args["name"].ToString();
    predicate = predicate.Or(x => x.name == name); //Access to modified closure
}

但是在上面,我没有name在任何地方修改,为什么它会告诉我这个?

我是 PredicateBuilder 的新手,所以如果有人解释什么PredicateBuilder.False<Person>()是相对的意思PredicateBuilder.True<Person>()以及该Compile方法的作用是什么?

4

1 回答 1

3

另外,如果我在 if 块之外声明字符串名称,resharper 会说访问修改的闭包,但在这种情况下是否重要?

尽管您的代码会生成此警告,但该代码仍然可以工作。name除非您在实际调用该闭包之前的某个时间修改变量,否则这恰好不是问题。在您展示的代码中,您再也不会使用它,所以这不会是一个问题,但是如果您曾经在代码之后显示的代码中修改过它,那将是一个问题。

你为什么首先要这样做?对于初学者,我并没有真正看到变量的意义。为什么不直接写:x => x.name == args["name"]?如果您确实想要一个局部变量,为什么要在更高级别对其进行范围?您应该始终在尽可能低的范围内限定任何变量,同时仍然允许在需要的地方访问它。你不应该在 . 之外修改它if,所以不要在if.

我是 PredicateBuilder 的新手,所以如果有人解释 PredicateBuilder.False() 的含义,而不是 PredicateBuilder.True()

它创建一个表达式,解析为falseif 被调用而不是true...

请注意,这false || variable相当于 just variable。您要将其初始化为 false 的原因是为了避免特殊情况下通过初始化您想要的第一个实际检查PredicateBuilder。它允许您的每个变量保持一致,并且始终OR与谓词构建器当前解析的任何变量保持一致。

Compile 方法有什么作用?

它将表达式编译为可以调用的委托。

于 2013-05-21T18:10:45.627 回答