2012-04-12 11 views
0

Wie verwende ich den folgenden Code richtig?So verwenden Sie dieses eine öffentliche IEnumerable <T> Suchen (Ausdruck <Func <T, bool>> Prädikat)?

public IEnumerable<T> Find(Expression<Func<T, bool>> predicate) 

Ich brauche eine IEnumerable eines bestimmten Objekt zurückzukehren, aber ich brauche das Sammelobjekt zu einem Abfragbare konvertieren und das Ergebnis umwandeln wieder zur Liste?

Unten ist meine Implementierung, ich weiß nicht, ob das korrekt ist, ich verwende den Code, um das generische Repository zu testen.

public IEnumerable<tbl_SBAem_Attendee> Find(Expression<Func<tbl_SBAem_Attendee, bool>> predicate) 
     { 
      var listtblsbaemAttendee = new List<tbl_SBAem_Attendee>(); 
      IEnumerable<tbl_SBAem_Attendee> enumerableAttendee=new List<tbl_SBAem_Attendee>(); 


      for (var i = 0; i < 10; i++) 
      { 
       var tblSbAemAttendee = new tbl_SBAem_Attendee 
              { 
               AT_AID = i, 
               AT_Address = "Address1" + i, 
               AT_Address2 = "Address2" + i, 
               AT_City = "City", 
               AT_Email = "[email protected]", 
               AT_EventID = null, 
               AT_FirstName = "Rene" + i, 
               AT_LastName = "Florendo" + i, 
               AT_GID = null, 
               AT_Org = "Rene's Club", 
               AT_Phone = "888-8888", 
               AT_Phone2 = "999-8888", 
               AT_RegID = null, 
               AT_SendInfo = null, 
               AT_State = "NJ", 
               AT_Title = "Mr", 
               AT_Zip = "4102", 
               AT_date = null, 
               AT_opt1 = "option1", 
               AT_opt2 = "option2", 
               AT_opt3 = "option3", 
               AT_opt4 = "option4", 
               AT_opt5 = "option5", 
               AT_opt6 = "option6", 
               AT_userID = null, 
               AttendeeID = 1 
              }; 
       listtblsbaemAttendee.Add(tblSbAemAttendee); 
      } 
      var result= listtblsbaemAttendee.AsQueryable().Where(predicate); 
      return result.ToList(); 
     } 

Jede Hilfe oder Anregungen wird sehr geschätzt. Danke.

Antwort

1

Wenn ich mich nicht falsch:

Where(Expression<Func<T, bool>>) ist eine Erweiterung für eine IQueryable

aber

Where(Func<T, bool>>) ist eine Erweiterung für ein IEnumerable.

So versuchen, den Parametertyp Ihrer Funktion zu ändern (oder es überlasten), und Sie werden nicht zu Abfragbare werfen müssen, um Ihr Prädikat zu verwenden (glaube nicht, dass Sie Expression benötigen)

EDIT

Der andere Weg wäre, kompilieren Sie Ihren Ausdruck (var Prädikatfunktion = Prädikat.Compile()), und verwenden Sie es in Ihrer "Where" -Klausel. Aber ich denke nicht, dass das der beste Weg ist ...

+0

Danke. Ich werde es versuchen. – user335160

+0

Das funktioniert. Aber warum bevorzugen die meisten Entwickler den Ausdruck >) über Func ? – user335160

+0

"Der Großteil des Entwicklers" bedeutet nicht viel ... Sie haben sich sicherlich einige Beispiele für Funktionen angesehen, die für DB-Abfragen verwendet werden (also mit IQueryables, die es vermeiden, Daten aus der Datenbank abzurufen, bevor Sie wollen). –

Verwandte Themen