我正在尝试在以下代码中使用谓词构建器:
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
答案 0 :(得分:1)
你没有在p.Id上获得Intellisense这一事实告诉我DBAccountDetail.Id可能要么不存在,要么没有getter,要么是私有的。如果你没有在“p”上获得intellisense,那么编译器可能没有正确解析DBAccountDetail?没有更多信息,不清楚问题可能是什么。
但是,值得注意的是,最新版本的Entity Framework和LINQ to SQL都支持这样的语法:
c.DBAccountDetails.Where(d => salesForceKey.Contains(d))
......而且这个:
c.DBAccountDetails.Where(d => salesForceKey.Any(k => k == d))
在这种情况下,其中任何一个都不会使PredicateBuilder成为必需。
答案 1 :(得分:0)
编译器可能无法猜测Or的泛型类型。尝试直接提供
predicate = predicate.Or<DBAccountDetail>(p => p.Id.Contains(temp))
顺便说一句,你应该能够用
进行一线预测var predicate =
salesForceKey.Aggregate(
PredicateBuilder.False<DBAccountDetail>(),
(accumulatedPredicate, keyword) => accumulatedPredicate.OrDBAccountDetail>(p => p.Id.Contains(temp))
);
答案 2 :(得分:0)
我有同样的问题,但我已将PredicateBuilder类放在另一个项目中。一旦我将它移动到与我的Linq To Sql类相同的项目中,错误就消失了。