2012-11-07 6 views
6

Ich muss über die Verwendung von PredicateBuilder wissen. Auf fast jedem Beispiel dafür, wie es zu benutzen, zeigen sie den Code wie folgt:Benötigen Sie Hilfe bei der Verwendung von PredicateBuilder

var predicate = PredicateBuilder.True<employee>(); 

if (!string.IsNullOrEmpty(txtAddress.Text)) 
    predicate = predicate.And(e1 => e1.Address.Contains(txtAddress.Text)); 
if (!string.IsNullOrEmpty(txtEmpId.Text)) 
    predicate = predicate.And(e1 => e1.Id == Convert.ToInt32(txtEmpId.Text)); 
if (!string.IsNullOrEmpty(txtDesc.Text)) 
    predicate = predicate.And(e1 => e1.Desc.Contains(txtDesc.Text)); 
if (!string.IsNullOrEmpty(txtName.Text)) 
    predicate = predicate.And(e1 => e1.Name.Contains(txtName.Text)); 

EmployeeDataContext edb= new EmployeeDataContext(); 
var emp = edb.Employees.Where(predicate); 
grdEmployee.DataSource = emp.ToList(); 
grdEmployee.DataBind(); 

Was ist das Employee Objekt, die zwischen der größer und kleiner als Klammern? Ich habe mir den Kopf zerbrochen. Ich verwende Linq zu SQL-Entities und ich bekomme Kompilierfehler, wenn ich das selbst versuche. Ich denke, die Fehler sind so etwas wie:

„kann nicht von einem Linq Tisch geworfen ...“

Ich bin ein Anfänger. Bitte verzeih mir, dass ich gefragt habe, was vielleicht naheliegend ist. Vielen Dank.

+0

Die '' <...> sind Generika genannt, ich weiß nicht, wie Linq zu verwenden, aber maby dies hilft: http://msdn.microsoft.com/en-us/library/bb546142.aspx –

Antwort

2

Wie in @MatsRietdijk im Kommentarbereich angegeben, werden Generika verwendet. Grundsätzlich können Sie mit Generika eine Methode erstellen, die mit einem Typ/Klasse ("Mitarbeiter" in diesem Fall) arbeitet, der unbekannt ist (obwohl Sie dies mit der where statement steuern können).

Wenn Sie den employee Typen für eine andere Art (z customer) ändern sind, dann ist die Eigenschaften in den lambda expressions würden auch anders sein, basierend auf was auch immer Eigenschaften öffentlich ausgesetzt waren. Zum Beispiel:

var predicate = PredicateBuilder.True<customer>(); 

// There is no "CustomerName" property from employee, but there is for customer objects 
if (!string.IsNullOrEmpty(txtName.Text)) 
    predicate = predicate.And(e1 => e1.CustomerName.Contains(txtName.Text)); 
+0

Danke für die Antwort. Ich habe diesen Punkt vergessen. Ich werde es versuchen. Danke auch MatsReitdijk für den Link. Danke noch einmal. –