2012-07-08 72 views
2

簡短的問題是:如何處理EF4中的數據透視表?除了「樞軸客戶端」以外的任何建議都將被認爲是有幫助的。EF4到數據集?和其他數據透視表瘋狂

一個想法是直接查詢數據庫並將結果放入數據集。這不是一個非常紳士的解決方案。我唯一的想法是使用某種反射魔法來動態地爲臨時對象創建屬性。我不知道如何在View中處理這個問題。

這裏的更詳細的解釋和諸如此類的東西:

我的申請件裝備。它允許用戶「聲稱」一件設備,然後爲該設備設置一個狀態。

相關的表結構如下:

EquipmentId, EquipmentName, etc 
    ClaimId, StatusChangeId, EquipmentId, UserId 
    StatusChangeId, StatusId, etc 
    StatusId, StatusName, etc 

我的查詢查找所有相關索賠的用戶(不刪除 或存檔或新的,只能用設定的狀態的),獲取最新的狀態對每個人來說,他們都會記起來,然後將他們與他們各自的設備聯繫起來。

這大屁股的動態查詢樞軸轉動數據,以創建像一個結果:

equipment name Total Status1 Status2 Status 3 
Computer   4   0  3  1 
Monitor    6   1  5  0 

問題是...我如何處理,在EF4?很明顯,沒有 清理解決方案,因爲狀態是動態的並且以 列的形式返回。這意味着對象將不得不神奇地創建 屬性。這些狀態在接下來的幾周內不太可能發生變化,所以作爲一個 臨時解決方案,我強制爲它提供了一個對象,其狀態爲 硬編碼。但是這是醜陋的醜陋的,有點擊敗我的動態列,以及整個狀態表的目的。

我唯一的其他的想法是採取和分裂我的漂亮的新查詢 只需不到一秒鐘對1000+記錄碰上一個獲取狀態和計數在單件的 裝備一個微小 一點查詢一段時間,並把它們放在一起代碼。

對於擁有數百種不同類型設備的用戶,這意味着數百次訪問數據庫。我還有另外兩個基於這個問題的查詢,這些查詢會爲與基本用戶關聯的用戶獲取設備信息...因此,如果有一個用戶擁有幾百種類型的設備,並且他與兩個其他用戶每個擁有70種類型的設備,並且他們有用戶關聯......您可以獲取圖片。

編輯

它發生,我認爲這可能通過將列與StatusName一個簡單的對象的列表,並算作一個EquipmentStatus對象的一部分來解決。可悲的是,我仍然不知道如何做映射。 Even though Microsoft acknowledges that handling pivots is an issue, their official word is "we don't know when it'll happen".

EDIT 2

只要我有時間,我將發佈我的最終解決方案。我們本週終於投入生產,所以可能會有幾天。對不起有人來這裏尋找答案。

+2

有兩件事:第一,「查詢使數據像創建一個表一樣」 - 實際上是* resultset *,而不是表;這導致:第二,你是否需要客戶端代碼中的**對象**來保存這個數據透視的結果?通常,如果不是在之前立即進行非常接近的旋轉,則顯示輸出結果;如果你不需要對象,直接進入商店連接並運行你的存檔!我不確定你的意思是通過生成一個「不是非常紳士的解決方案」的數據集 - 你缺少什麼? – AakashM 2012-07-09 08:26:55

+0

修正了術語。而且我不需要「物體」,但我總體上非常憤怒,因爲EF4在處理這樣的事情方面非常糟糕。他們的記錄的列和數據類型對我來說是已知的,所以我應該能夠創建一個嵌套的對象列表來處理列。它開始看起來像數據集是唯一可行的答案。 – Will 2012-07-09 09:24:24

回答

0

EF無法處理這樣的動態查詢-EF是強類型的,因此您至少需要一個具有與結果集中列名稱相同名稱的類型(類)。這種類型可用於實現結果集中的記錄。

那麼如何在動態結果集中使用這種方法呢?它需要先查詢數據庫,以獲取真實查詢中使用的列的名稱,使用Reflection.Emit創建一個動態類型的動態程序集(針對每個具有不同結果集的查詢的新程序集)並以某種動態方式使用它(可能通過反思)。

一個想法是直接查詢數據庫並將結果放入 數據集。這不是一個非常紳士的解決方案。

DataSetDataAdapterDbCommand是具有動態結果集的查詢類。這些類如何比運行時創建程序集的解決方案更糟? DataSet將允許您在幾分鐘內執行此操作!

+0

幾乎沒有什麼我能想到的比使用反射在運行時創建類型更糟糕。使用原始數據集(ORM elitism除外)的最大問題是我在顯示時必須使用狀態表中包含的其他信息,例如顏色和其他信息。 – Will 2012-07-09 10:03:16

+0

好的,所以我使用了一個數據集。因爲我必須使用其他表中的數據,所以我創建了一個對象並用數據填充它。我會爲遇到這個問題的其他人詳細回答這個問題,但如果它能讓我接受你的答案,那麼它會讓我走上這條道路。 – Will 2012-07-09 12:10:43

+0

我不認爲我同意EF無能爲力。 EF無法實現,確實如此。如果你感覺很勇敢,你可以用T4模板創建一個詞典列表,甚至是一個巨大的數組。這不會讓你對DataSet有太多的瞭解,但它應該可以用EF來完成。 – 2012-07-09 15:04:11

相關問題