2012-10-02 26 views
1

好了,所以這裏的問題是,我有在包含-大量的信息,100ish列的數據庫視圖,vwComponantAEF5映射IQueryable的自定義類列屬性

我有我的中的一個實體。 net應用程序稱爲ComponantA,其中包含使用[Column()]屬性的所有映射,這很好,可以工作,但速度很慢,因爲它在數據庫上執行select *來填充對象,而且這種方法仍然有效。

爲了解決上述性能問題,我介紹了DynamicLinq。這使我能夠減少回收的列數量,並且仍然允許使用類型安全性來使用正常的Linq查詢,這非常棒。然後處理裁減字段,我帶回了POCO組件,每個組件都有自己的一組[Column]屬性,它們在運行時使用映射類映射。

問題是,在處理大型數據集時,這些映射之間的映射可能非常緩慢,10000條記錄映射10000次等.EF所做的是創建一個DynamicProxyClass,然後在組件之間進行映射。

我的問題是,我怎樣才能避免映射,讓EF爲我做映射? (我正在處理IQueryable而不是IQueryable<T>因爲動態linq)

必須有一種方法來利用[列]屬性,同時保持查詢動態。

這是所有的代碼第一和實體框架5.

感謝您的幫助。尼克

回答

0

說實話,我不明白你的問題,但你想要做什麼並不需要動態LINQ。你只需要預測:

var data = from c in context.vwComponentA 
      select new POCOWithIdAndName { 
       Id = c.Id, 
       Name = c.Name 
      }; 

投影在數據庫中執行,因此會帶回只有IdName

+0

我這樣做的原因是因爲某些特定類型的列中存在特定的規則。即視圖上有5列表示所有東西,但只有一列我想要映射回我的對象​​上的通用屬性。這有意義嗎? –

+0

我仍然不明白爲什麼它應該是與投影問題,你明確地說哪個列被分配到哪個屬性。 –

+0

好吧,所以我使用DynamicSQL的原因是,例如我有一個5列的視圖,它們都有類似的含義,但取決於用戶通過UI選擇的內容,其中一個需要映射回一個名爲'結果「,這個屬性然後推動了很多邏輯。所以它不像「結果= c.Outcome」那麼簡單,更像是「結果= c。<在運行時確定的屬性>」。我想問題是,我怎麼能用你上面提出的建議來做到這一點? (我可能更困惑你 - 讓我把一些東西放在zerobin上) –