我有以下查詢:限制查詢基於在運行時設置列表的列
// Type T is constrained to a class that contains "ID" property
// propertiesToQuery is a list constructed based on type T
var set = AppContext.Set<T>();
var result = set.SelectMany(x => propertiesToQuery.Select(p => new { x.ID, Value = x.GetType().GetProperty(p.Name).GetValue(x) })
.Where(p => p.Value != null)
.Select(p => new SearchIndexItem
{
Key = p.Value.ToString(),
Url = Url.Action("Edit", type.Name, new { p.ID }),
Type = type
}));
現在因爲LINQ到實體不允許在查詢中使用的PropertyInfo,我需要運行一個ToList()在集爲了首先在db上執行查詢,然後執行所需的SelectMany()。
從數據庫中查詢超過它需要的數據量,當數據量很大時(查詢的列是字符串類型的,其他的可以是blob,這些是我不想拉的數據庫數據從)
所以問題是我怎麼能限制列基於在運行時構造的列表查詢數據庫?
我試圖創建一個表達式樹,並把它傳遞到機上的Select()方法,但問題是與創建匿名類型,它可以在T類型
哇,這是一個有趣的方法。我可以使用代理/適配器/裝飾器而不是dto類型,或者將實體框架檢測到繼承並拋出錯誤嗎? – Chris 2013-04-11 11:18:10
@Chris不知道 - 如果你知道,請告訴我 – 2013-04-11 11:29:42
不幸的是,這是不可能的:/但非常感謝這個想法,我認爲我應該能夠根據自己的需要進行調整。 – Chris 2013-04-11 11:55:47