2010-03-23 103 views
4

如果您創建一個包含標準的LINQ一個Filter對象,通常進了其中相似的這一條款:如何在Linq where子句中指定動態字段名稱?

var myFilterObject = FilterFactory.GetBlank(); 
myFilterObject.AddCondition("Salary", "lessThan", "40000"); 

var myResult = myRepository.GetEmployees(myFilterObject); 

你會如何LINQ的領域字段名稱相匹配,而無需使用大case語句?

return from e in db.Employee 
     where e.Salary < 40000 
     select new IList<EmployeeViewModel> { Name= e.name, Salary= e.Salary }; 

我假設你需要發送一個對象到指定過濾的存儲庫,以便你只需要取出你需要的記錄。我假設Linq沒有預編譯(除非你創建一個自定義的委託和函數),所以你應該能夠動態地指定你想要過濾的字段。

如果您可以像e某某類型的Expando對象一樣執行某些操作(如「薪水」),那將會很好。

回答

8

我建議你看看Linq to SQL的例子中的Dynamic Query。你可以用它來寫「純文本」的條件,如:

var employees = db.Employee.Where("Salary < 40000").Select(...); 

澄清:這些擴展基本建立相同的表達式樹了,您通過lambda表達式通常構建字符串的,所以這不是與將原始SQL寫入數據庫相同。唯一的缺點是你不能使用查詢理解語法(from x in y等)。

+0

現在是一個奇妙的答案。 – 2010-03-23 03:07:09

+0

好吧,現在如果你有一個Enumeration作爲值,現在如何使用它?像在http://stackoverflow.com/q/7075816/185593 – serhio 2011-08-16 10:14:12

7

你可以手工打造的表達,就像這樣:

var eParam = Expression.Parameter(typeof(Employee), "e"); 

var comparison = Expression.Lambda(
    Expression.LessThan(
     Expression.Property(eParam, "Salary"), 
     Expression.Constant(40000)), 
    eParam); 

return from e in db.Employee.Where(comparison) 
     select new EmployeeViewModel { Name = e.name, Salary = e.Salary }; 
+0

非常好的方式來添加條件。 – 2010-03-24 05:01:26

+1

我在嘗試實現這個時遇到編譯器錯誤,請看看http://stackoverflow.com/questions/23787795/dynamic-linq-expression – reggaeguitar 2014-05-21 15:36:11