2011-01-13 9 views
1

Ich versuche Prädikat Builder in dem folgenden Code zu verwenden:C# Prädikat Builder funktioniert nicht

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); 
     } 
    } 

Das Problem ist, dass auf dieser Linie:

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

p.Id nicht IntelliSense aus und wirft eine Übersetzungsfehler aus:

No overload for method 'Or' takes 1 arguments 

What is PredicateBuilder

+0

Welcher Typ ist DBAccountDetail.Id? Wenn es ein int ist, würde ich fragen, wie Sie erwarten, dass "p.Id" eine Zeichenkette "enthält"? – StriplingWarrior

+0

Es ist eine Zeichenfolge. Ich möchte tatsächlich verwenden: (p => p.Id == temp) –

+0

Bitte fügen Sie den vollständigen Fehler, den Sie bekommen. Soweit ich das beurteilen kann, sollte das funktionieren. –

Antwort

0

Es ist möglich, dass der Compiler den generischen Typ für Or nicht erraten kann. Versuchen Sie es direkt

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

Als Bereitstellung beiseite, sollten Sie auf 1-zeiliges der Lage sein, die mit

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

Auf dem obigen Code erhalte ich den folgenden Fehler: Fehler Die nicht generische Methode 'System.Linq.Expressions.Expression.Or (System.Linq.Expressions.Expression, System.Linq.Expressions.Expression)' kann nicht mit Typargumenten verwendet werden –

1

Die Tatsache, dass Sie Intellisense nicht auf p.Id immer sagt mir, dass DBAccountDetail .Id existiert wahrscheinlich entweder nicht, hat keinen Getter oder ist privat. Wenn Sie auf dem "p" nicht intellisense erhalten, dann löst der Compiler möglicherweise DBAccountDetail nicht korrekt auf? Ohne weitere Informationen ist nicht klar, was das Problem sein könnte.

Allerdings ist es wohl der Mühe wert zu beachten, dass die neuesten Versionen von Entity Framework und LINQ sowohl Unterstützung Syntax wie folgt SQL:

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

... und:

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

Entweder von diesen würde PredicateBuilder in diesem Fall überflüssig machen.

+1

c.DBAccountDetails.Where (d => salesForceKey.Contains (d.Id)). ToList(); <--- Diese Linie hat PERFEKT funktioniert! Vielen Dank. –

0

Ich habe das gleiche Problem, aber ich hatte die PredicateBuilder-Klasse in einem anderen Projekt platziert. Sobald ich es in dasselbe Projekt wie meine Linq To Sql-Klassen verschoben habe, ging der Fehler weg.