需要帮助使用PredicateBuilder

时间:2012-11-07 00:47:05

标签: sql linq 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表转换为......”

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

1 个答案:

答案 0 :(得分:2)

正如@MatsRietdijk在评论部分所述,这是使用的泛型。基本上,使用泛型,您可以创建一个方法,该方法将对未知的类型/类(在此实例中为“employee”)进行操作(尽管您可以使用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));