2011-01-10 4 views
4

В Linq к SQL Где метод расширения принимает, в качестве параметра, то, что выглядит следующим образом:Linq к SQL Где метод расширения Вопрос

Expression<Func<Table,bool>> predicate 

Может кто-то описать, в простых терминах, именно то, что это заявление означает? Я хочу создать метод, который принимает один из них, который я могу передать на запрос L2S, и я хочу точно понять, что это такое и как его следует вызывать.

спасибо.

ответ

4

Тип переменной Expression<Func<Table, bool>> означает, что он принимает выражение кода, представляющее выражение метода/делегата/лямбды, который принимает параметр Table и возвращает bool. Метод, который принимает параметр Expression<>, предназначен для анализа кода для генерации другого кода, а не для оценки самого Expression. LINQ to SQL может использовать их для генерации кода SQL, чтобы делать то, что представляет ваш код.

Странная вещь о Expression<> параметров является то, что вы передаете значения в них так же, как вы бы передать лямбда-выражение, но является ли ваше значение интерпретируется как Expression или лямбда зависит от сигнатуры метода Вас» переходя в него.

Вот пример прохождения 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); 
} 
+0

+ 1..for 'addWhereClause' метод – Vishal

+0

Отличная работа Если бы я мог голосовать вас больше, чем один раз, я бы сделал так. –

1

Я просто предоставляя простое объяснение того, как выражения work.From пример кода в примере, приведенном 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 

Так простыми словами, у вас есть функция, которая возвращает истину, если нет < 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 
Смежные вопросы