2011-01-13 54 views
1

我尝试使用下面的代码谓词建设者:C#谓词生成器不工作

public ListResults<DBAccountDetail> GetAccountDetail(string[] salesForceKey) 
    { 
     try 
     { 
      using (var c = new SalesForceDataContext()) 
      { 
       var predicate = PredicateBuilder.False<DBAccountDetail>(); 

       foreach (var keyword in salesForceKey) 
       { 
        var temp = keyword; 
        predicate = predicate.Or(p => p.Id.Contains(temp)); 
       } 

       var lret = c.DBAccountDetails.AsQueryable().Where(predicate).ToList(); 
       return new ListResults<DBAccountDetail>(lret); 
      } 
     } 
     catch (Exception ex) 
     { 
      LogError("GetLegacyRateLetters()", ex); 
      return new ListResults<DBAccountDetail>(ex); 
     } 
    } 

的问题是,在这条线:

predicate = predicate.Or(p => p.Id.Contains(temp)); 

p.Id不会智能感知并抛出一个编译错误:

No overload for method 'Or' takes 1 arguments 

What is PredicateBuilder

+0

DBAccountDetail.Id是什么类型?如果它是一个int,我会问你期望`p.Id`如何“包含”一个字符串? – StriplingWarrior 2011-01-13 23:07:05

+0

这是一个字符串。我实际上想要使用:(p => p.Id == temp) – 2011-01-13 23:15:02

+0

请粘贴您获得的完整错误。据我所知,应该工作。 – 2011-01-13 23:17:46

回答

0

编译器可能无法猜测Or的泛型类型。尝试直接向它提供

predicate = predicate.Or<DBAccountDetail>(p => p.Id.Contains(temp)) 

顺便说一句,你应该能够1线与

var predicate = 
salesForceKey.Aggregate(
    PredicateBuilder.False<DBAccountDetail>(), 
    (accumulatedPredicate, keyword) => accumulatedPredicate.OrDBAccountDetail>(p => p.Id.Contains(temp)) 
); 
1

,你不p.Id让智能感知告诉我事实的foreach DBAccountDetail .Id可能不存在,没有吸气剂,或者是私密的。如果你没有在“p”上获得智能感知,那么编译器可能没有正确解析DBAccountDetail?没有更多的信息,目前还不清楚问题可能出在哪里。

但是,它可能是值得的注意的是实体框架和LINQ的最新版本SQL这样既支持语法:

c.DBAccountDetails.Where(d => salesForceKey.Contains(d)) 

...这:

c.DBAccountDetails.Where(d => salesForceKey.Any(k => k == d)) 

无论是这些将会使PredicateBuilder在这种情况下不必要。

0

我有同样的问题,但我已经在另一个项目中放置PredicateBuilder类。一旦我将它移入与Linq To Sql类相同的项目中,错误就消失了。