1

我正在尝试在以下代码中使用谓词生成器:

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

什么是 PredicateBuilder

4

3 回答 3

1

您没有在 p.Id 上获得 Intellisense 的事实告诉我 DBAccountDetail.Id 可能不存在,没有吸气剂,或者是私有的。如果您没有在“p”上获得智能感知,那么编译器可能没有正确解析 DBAccountDetail?没有更多信息,尚不清楚问题可能是什么。

但是,可能值得注意的是,最新版本的 Entity Framework 和 LINQ to SQL 都支持如下语法:

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

... 和这个:

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

在这种情况下,这些中的任何一个都会使 PredicateBuilder 变得不必要。

于 2011-01-13T23:36:17.610 回答
0

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

于 2013-11-19T20:01:03.367 回答
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))
);
于 2011-01-13T23:23:15.073 回答