2016-01-13 50 views
0

以我簡化示例我有以下屬性的對象:EF6 IQueryable的動態LINQ凡(謂詞,值)與DbFunctions.TruncateTime

  • 名稱(字符串)
  • BirthDateTimeStamp(日期時間)

我需要BA能夠通過以下方式來構建動態查詢

var predicate = "Name = @0"; 
var values = new object[]{"Ed"}; 
myIQueryableDataSource.Where(predicate, values) 

釷工作很好。現在我想比較我的日期時間

var predicate = "BirthDateTimeStamp >= @0"; 
var values = new object[]{someDateTime}; 

這也很好。但是當比較日期時間和這個問題時,我實際上想要做的事情,當等於僅僅比較日期時顯示自己更好。

var predicate = "BirthDateTimeStamp.Date >= @0"; 

因爲日期財產不被認可的EF到SQL Server

var predicate = "System.Data.Entity.DbFunctions.TruncateTime(BirthDateTimeStamp) >= @0"; 

這也沒有工作,因爲我只能在謂詞訪問我的對象屬性這是不可能的。

我該如何解決這個問題,所以謂詞保持字符串格式。這段代碼只是我現有的一個大型語法分析器的一部分,並且可以完全重寫。

回答

0

https://stackoverflow.com/a/26451213/525788

System.Linq.Dynamic是解析你給爲C#,但不承認階級DbFunctions表達。然而,你可以在DbFunctions補丁作爲一個預定義類型:

var type = typeof(DynamicQueryable).Assembly.GetType("System.Linq.Dynamic.ExpressionParser"); 

FieldInfo field = type.GetField("predefinedTypes", BindingFlags.Static | BindingFlags.NonPublic); 

Type[] predefinedTypes = (Type[])field.GetValue(null); 

Array.Resize(ref predefinedTypes, predefinedTypes.Length + 1); 
predefinedTypes[ predefinedTypes.Length - 1 ] = typeof(DbFunctions); 

field.SetValue(null, predefinedTypes); 

然後你可以使用

var predicate = "DbFunctions.TruncateTime(BirthDateTimeStamp) >= @0";