2012-11-07 151 views
6

我需要知道如何使用PredicateBuilder。在如何使用它几乎每一个例子,它们显示的代码如下:使用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(); 

那是什么Employee对象,一间大于和小于括号?我已经绞尽脑汁。我正在使用Linq到SQL实体,当我自己尝试这个时会出现编译错误。我认为错误是这样的:

“不能从一个LINQ表转换为...”

我是一个初学者。请原谅我问什么可能是一件显而易见的事情。谢谢。

+0

那些''<...>被称为仿制药,我不知道如何使用LINQ,但莫比这有助于:http://msdn.microsoft.com/en-us/library/bb546142.aspx –

回答

2

正如@MatsRietdijk在评论部分所述,这是使用的泛型。基本上,对于泛型,您可以创建一个方法,该方法将在未知的类型/类(本例中为“员工”)上进行操作(尽管您可以使用where statement来控制此类)。

如果你改变employee类型为其他类型(例如customer),然后在lambda expressions提供的属性也将是不同的,基于什么性质,公开曝光。例如:

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

谢谢你的回答。我忘了那一点。我会试试看。此外,感谢您的链接MatsReitdijk。再次感谢。 –