2012-11-07 25 views
6

Potrzebuję wiedzieć o użyciu PredicateBuilder. Na prawie każdym przykładzie, jak go używać, pokazują kod w następujący sposób:Potrzebujesz pomocy w używaniu 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(); 

Co to Employee obiekt, jeden między większa niż i mniejsze niż nawiasach? Wkurzyłem się o to. Używam Linq do encji SQL i otrzymuję błędy kompilacji, kiedy sam to wypróbuję. Myślę, że są błędy coś takiego:

„nie może rzucać z tabeli LINQ do ...”

Jestem początkującym. Proszę, wybacz mi, że pytam, co może być oczywiste. Dziękuję Ci.

+0

Ci '' <...> nazywane są generyczne, nie wiem, jak korzystać z LINQ, ale maby to pomaga: http://msdn.microsoft.com/en-us/library/bb546142.aspx –

Odpowiedz

2

Jak napisał @MatsRietdijk w sekcji komentarzy, to jest używany rodzajowy. Zasadniczo w przypadku generycznych można utworzyć metodę, która będzie działać na typie/klasie ("pracownik" w tym przypadku), który jest nieznany (chociaż można to kontrolować za pomocą where statement).

Jeśli było zmienić employee typ dla innego typu (np customer), wówczas właściwości dostępne w lambda expressions byłaby również inna, oparta na cokolwiek właściwości zostały publicznie ujawnione. Na przykład:

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

Dziękuję za odpowiedź. Zapomniałem tego. Spróbuję tego. Dziękuję również MatsReitdijk za link. dzięki jeszcze raz. –

Powiązane problemy