Linq to SQL Where扩展方法问题

时间:2011-01-10 16:49:03

标签: linq linq-to-sql

Linq to SQL其中扩展方法作为参数采用如下所示的内容:

Expression<Func<Table,bool>> predicate

有人能用简单的语言描述这个陈述的含义吗?我想创建一个方法,其中包含其中一个,我可以传递给L2S查询,我想要准确理解它是什么,以及如何调用它。

谢谢。

2 个答案:

答案 0 :(得分:4)

变量类型Expression<Func<Table, bool>>表示它接受表示方法/委托/ lambda表达式的代码表达式,该表达式采用Table参数并返回bool。采用Expression<>参数的方法旨在解析代码以生成其他代码,而不是评估Expression本身。 LINQ to SQL可以使用它们生成SQL代码来执行代码所代表的内容。

关于Expression<>参数的奇怪之处在于,您将值传递给它们的方式与传递lambda表达式的方式相同,但是您的值是否被解释为Expression或lambda取决于你传递给它的方法的签名。

以下是将Expression<Func<Table, bool>>传递给方法的示例(看起来与传递Func<Table, bool>参数相同:

theMethod(table => table.NumLegs > 3);

// or to be more explicit:
theMethod((Table table) => table.NumLegs > 3);

// or...
theMethod(delegate(Table table) { return table.NumLegs > 3; } );

以下是您编写自己的方法的方法,该方法将一个参数作为参数应用于L2S查询:

IQueryable<Table> addWhereClause(
    IQueryable<Table> tables, Expression<Func<Table, bool>> whereClause)
{
    return tables.Where(whereClause);
}

答案 1 :(得分:1)

我只是提供了一个关于表达式如何工作的简单解释。从给定here示例中的示例代码是一个例子 -

System.Linq.Expressions.Expression<Func<int, bool>> expr = i => i < 5;
// Compile the expression tree into executable code.
Func<int, bool> deleg2 = expr.Compile();
// Invoke the method and print the output.
Console.WriteLine("deleg2(4) = {0}", deleg2(4));
//OUTPUT : deleg2(4) = True

所以用简单的话说你有一个函数,如果没有&lt; 5喜欢 -

Func<int, bool> deleg = i => i < 5;

所以你可以使用上面的语法构建一个表达同样事物的表达式然后传递给它说 一个Where或者某件事simliar.Simple示例 -

int[] i={1,2,3,4,5} 
System.Linq.Expressions.Expression<Func<int, bool>> expr = i => i < 5;
 var result=i.Where(expr);//equivalent to i.Where(c=>c<5)

在你的情况下,你有一个表作为参数,所以它将采取一个表对象并返回bool。

List<Employee> e= new List<Employee>();
   e.Add(new Employee(1,"ABC",5000));
   e.Add(new Employee(2,"ACC",5000));
   e.Add(new Employee(3,"ADC",50009));
    System.Linq.Expressions.Expression<Func<Employee, bool>> expr =e => e.Salary < 50000;
     var result=e.Where(expr);//give all employee with salary<50000