【问题标题】:Combine And/Or with PredicateBuilder?与 PredicateBuilder 结合和/或?
【发布时间】:2013-05-30 14:43:41
【问题描述】:

我有一个Ids 的列表,我只想在第一个上做一个AND,在后面的一个上做一个OR。过去,我保留了一个counter 变量,当counter 为1 时,我执行And,但之后我执行OR,但我很好奇是否有更简单的方法:

foreach(string id in Ids)
{
   predicate.And(x=> id.Contains(x.id)); //I want to do an And only on the first id.
}

这是我过去做的,但是有没有更简洁的方法:

int counter = 1;
foreach (var Id in Ids)
{
     string i = Id;
     if (counter == 1)
     {
         predicate = predicate.And(x => i.Contains(x.id));
         counter++;
      }
      else
      {
           predicate = predicate.Or(x=>i.Contains(x.id));
          counter++;
      }
   }

【问题讨论】:

    标签: c# .net-3.5 predicatebuilder


    【解决方案1】:

    这适用于 PredicateBuilder 的本地副本(没有 entityFramework 或 LinkToSql 可用):

    var firstID = ids.First();
    predicate.And(x => firstID.Contains(x.id));
    
    foreach (string id in ids.Skip(1))
    {
        var localID = id;   //access to a modified closure otherwise
        predicate.Or(x => localID.Contains(x.id)); 
    }
    

    【讨论】:

    • 带有 And 的那个给了我错误:{"Unable to create a constant value of type 'Closure type'. Only primitive types ('such as Int32, String, and Guid') are supported in this context."}。 ids 是一个字符串[]
    • @xaisoft:哪一行给出了这个错误? AndOr?
    • @Pondidum 可能是第一个。只需在 lambda 之外调用 ids.First(),这样它就不会被编译到表达式中。
    • @Servy:是的,我只是在写一个testapp来先检查一下
    • 这行得通,但它就像我原来的方式一样,只使用一个 string.Contains。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2016-07-15
    相关资源
    最近更新 更多