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.IdIntelliSense は実行されず、次のコンパイル エラーがスローされます。

No overload for method 'Or' takes 1 arguments

PredicateBuilder とは

4

3 に答える 3

1

p.Id で Intellisense を取得していないという事実は、DBAccountDetail.Id がおそらく存在しないか、getter がないか、プライベートであることを示しています。「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

コンパイラがOrのジェネリック型を推測できない可能性があります。直接提供してみてください

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

余談ですが、foreachを1行に並べることができるはずです。

var predicate =
salesForceKey.Aggregate(
  PredicateBuilder.False<DBAccountDetail>(),
  (accumulatedPredicate, keyword) => accumulatedPredicate.OrDBAccountDetail>(p => p.Id.Contains(temp))
);
于 2011-01-13T23:23:15.073 に答える