2011-01-10 32 views
4

的LINQ到SQL凡擴展方法同樣採用一個參數,一些看起來是這樣的:的LINQ to SQL凡擴展方法問題

Expression<Func<Table,bool>> predicate 

可能有人形容,簡單地說,正是這種說法的手段?我想創建一個方法來接受其中的一個方法,我可以將它傳遞給L2S查詢,並且我想明確地知道它是什麼,以及它應該如何調用。

謝謝。

回答

4

變量類型Expression<Func<Table, bool>>意味着需要表示方法/委託/λ表達,需要一個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); 
} 
+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 

那麼簡單的話,你說如果有返回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) 

在你的情況你有一個表作爲參數,所以它會採取一個表對象和返回布爾。

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