Linq to SQL, где вопрос метода расширения - PullRequest
4 голосов
/ 10 января 2011

Linq to SQL Где метод расширения принимает в качестве параметра нечто, похожее на это:

Expression<Func<Table,bool>> predicate

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

Спасибо.

Ответы [ 2 ]

4 голосов
/ 10 января 2011

Тип переменной 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);
}
1 голос
/ 10 января 2011

Я просто даю простое объяснение того, как работают выражения. Из примера кода в приведенном примере здесь приведен пример -

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

Итак, простыми словами, у вас естьфункция, которая возвращает true, если нет <5 like - </p>

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

. Таким образом, вы можете построить выражение, делающее то же самое, используя синтаксис выше, а затем передать его, чтобы сказать Where или что-то похожее.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...