2014-07-05 63 views
0

這行代碼:反思的LINQ

db.Set<T>().Max(d => d.GetType().GetProperty("DateTimePropertyName").GetValue(d)) 

導致此異常:

LINQ to Entities does not recognize the method 'System.Object GetValue(System.Object)' method 

我如何工作的呢?

+0

我認爲它不會工作,因爲你正在查詢一個數據庫,它不會支持GetType()... –

+0

計算是否執行在服務器端很重要?您基本上要求服務器計算LinqToEntities無法與服務器通信的內容。 – Tormod

回答

0

默認情況下,它假設你通過Expression<Func<T,TResult>>,但你需要的是通過Func<T,TResult>

Func<T, object> f = p => p.GetType().GetProperty("DateTimePropertyName").GetValue(p); 
_context.Set<T>().Max(f); 

它源於IEnumerable的,所以它會如果打性能你的桌子很大

+0

它的工作原理,但正如你所說,它擊中了性能 – Mehrdad

1

您試圖運行c#代碼,它假設以某種方式被轉換爲SQL,但不能。

This是一個很好的開始。

你有兩種選擇:從DB

1.Fetch的數據,並通過它與LINQ到對象 - Probally最簡單的,而不是做的事情,因爲一些查詢可以返回大集合的最好方式。

2.試着找一個更好的方式來做你正在做的事情。你爲什麼要這個反射代碼運行?目的是什麼? DateTimePropertyName是否公開?如果是這樣,爲什否則,這樣的事情應該工作:

db.Set<T>().Max(d => d.DateTimePropertyName); 
+0

這是一個泛型類,我需要在服務器端完成它。 – Mehrdad

+0

你應該刪除「== Something」,也許在1中給一些代碼。否則,很好的答案。 +1 –

+0

@MarkusJohnsson - 你說的對..我做了==錯誤的東西:) –