2012-01-27 93 views
2

我試圖實現數據庫表的文本搜索。我有一個通用的存儲庫,並不想爲每個我想要公開的模型創建派生的數據庫,因爲數據庫中有很多。實體框架中的泛型類型的文本搜索

所以我遇到問題的代碼如下:

var props = typeof(T).GetProperties() 
    .Where(p => p.PropertyType == typeof(string)); 

IEnumerable<T> searched = null; 
if (!string.IsNullOrWhiteSpace(searchTerm)) 
    searched = sorted.Where(c => props 
     .Select(p => (string)p.GetValue(c, null)) 
     .Select(v => v.Contains(searchTerm)) 
     .Contains(true)); 

我喂這從一個小小的反射獲得的PropertyInfo的集合。可能不是一個高性能的想法,但我還沒有想到一個更好的方法。因此,這些可能是字符串類型的所有屬性(搜索表中的所有字符串),或者它可能會拉動具有自定義可搜索屬性的模型中的某些屬性。

的運行時異常,我得到的是:

NotSupportedException異常:無法創建類型的常量值 'System.Reflection.PropertyInfo'。在此上下文中僅支持基本類型(如' Int32,String和Guid')。

我可以看到我正在使用反射,但不太清楚究竟是什麼導致這裏的異常。如果有人能指出這一點,那麼將非常感激,但如果有人可以提出更好的方法來做到這一點,那將是驚人的。提前致謝!

回答

1

問題是,當執行LINQ查詢時,它試圖構造一個SQL查詢以在數據庫上執行。異常消息表明只有基本類型可以在LINQ查詢中使用,因爲這些是唯一可以成功轉換爲SQL查詢的類型。

希望解決您的問題,您只需確保在使用非基元類型擴展LINQ查詢之前執行數據庫SQL查詢。

我猜你的代碼片段中的sorted變量是LINQ查詢,因此請致電sorted.AsEnumerable()在數據庫上執行SQL查詢,然後執行搜索功能。

searched = sorted.AsEnumerable() 
       .Where(c => props.Select(p => (string)p.GetValue(c, null)) 
            .Any(v => v.Contains(searchTerm))); 
+0

感謝您的回答。你對這個問題是正確的,但解決方案並不完全是我所追求的。 where子句中的反射是爲了過濾數據庫中的列。我真正需要的是替代反思來做到這一點。上投票都是一樣的。 :) – 2012-02-13 22:42:33