2012-07-12 107 views
-8

我的LINQ查詢就像下面的代碼。在LINQ中創建表達式

var data2 = data.Where(c => String.Format("{0:MM/dd/yyyy}", c.OrderDate) == "07/04/1996"); 

我需要在下面的表達式中自定義格式化列的謂詞。我需要爲謂詞編寫表達式並根據格式過濾數據。請檢查下面的代碼。

pred =Expression.Equal(membertype, Expression.Constant(value, type)); 
lambda = Expression.Lambda(predicate, paramExpression); 
source.Where(paramExpression, predicate); 

謝謝。

+4

爲什麼這個** **需要被轉換:如果是這樣,可以在使用PredicateBuilder更簡單的方式來完成?它不起作用嗎?此外,它已經是一個lambda表達式... – 2012-07-12 08:44:02

+0

這已經是一個lambda表達式。通過[this](http://www.codeproject.com/Articles/33769/Basics-of-LINQ-Lamda-Expressions) – R76 2012-07-12 08:49:39

+0

我已經修改了查詢來理解。 – 2012-07-12 09:04:56

回答

0

下面是一個示例,它動態創建.Where

static void DynamicWhereBuilder() 
     { 
      var datas = new Data[] 
      { 
       new Data { OrderDate = "07/04/1996"}, 
       new Data { OrderDate = "07/04/1990"}, 
       new Data { OrderDate = "07/04/2001"}, 
       new Data { OrderDate = "2012/04/07"} 
      }; 
      IQueryable<Data> queryableData = datas.AsQueryable<Data>(); 

      var formatConstant = Expression.Constant("{0:MM/dd/yyyy}", typeof(string)); 
      var parameter = Expression.Parameter(typeof(Data), "dataArg"); 
      var property = Expression.Property(parameter, "OrderDate"); 

      var left = Expression.Call(property, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(object) }), formatConstant, property); 
      var right = Expression.Constant("07/04/2001", typeof(string)); 

      var equal = Expression.Equal(left, right); 

      var whereCallExpression = Expression.Call(
       typeof(Queryable), 
       "Where", 
       new Type[] { queryableData.ElementType }, 
       queryableData.Expression, 
       Expression.Lambda<Func<Data, bool>>(equal, new ParameterExpression[] { parameter })); 

      var results = queryableData.Provider.CreateQuery<Data>(whereCallExpression); // returns the object with OrderDate = "07/04/2001" 

     } 
+0

我無法運行你的代碼,如果這樣做拋出下面的異常 靜態方法需要空實例,非靜態方法需要非空實例。 參數名稱:實例 – 2012-07-12 13:24:14

+3

如果不提供詳細信息,不能指望人們幫助您。你如何運行代碼以及發生異常的地方? – Alex 2012-07-12 13:51:31