2009-09-24 114 views
5

通常我需要組合多個表中的數據並將結果顯示在GridView控件中。Linq to SQL設計問題

我可以寫在Page_Load事件LINQ查詢在線,返回結合,我需要的所有字段匿名類型,數據綁定結果到GridView控件。

  • 問題:我使用Scott Guthrie on his blog描述的'幫手方法'。這種幫助方法不能返回匿名類型。查詢將不得不內聯這種方法。

我可以編寫一個數據庫視圖,它返回我需要的數據,並用它返回的這個(新的和已知的)類型的查詢編寫一個幫助器方法。

  • 問題:在數據庫模式中我需要很多視圖,而且我會介紹很多數據的冗餘方面。我也失去了使用Linq的一些優勢 - 從數據庫中刪除所有業務邏輯。

我想採取的做法,讓我保持LINQ查詢的輔助方法,還可以讓我訪問,我需要在各自的數據綁定表達式網格中的所有屬性。這可以做到嗎?

+0

這是C#嗎?如果是這樣,您將通過添加C#標籤獲得更多視圖。如果您使用的是GridView控件,我假設ASP.NET。 – 2009-09-24 17:06:41

+0

我不認爲語言很重要。 – cdonner 2009-09-24 17:20:12

回答

1

我問了一個錯誤的問題,就像我經常這樣做。是什麼促使我查看匿名類型是GridView的明顯限制 - 我無法在<asp:BoundField>(DataField參數只接受Linq查詢引入的表的列名)中使用數據綁定表達式。

原來,在TemplateField中它可能使用Eval和Linq數據項的訪問成員,Linq負責爲我查詢查詢。 換句話說,我可以將查詢保留在我的幫助器方法中,讓它返回主數據庫表類型(例如Account),並將帳戶綁定到GridView。 在數據綁定表達式中,我可以訪問駐留在其他表中的Account對象的數據成員,而不必在查詢中明確地拉入它們。完善。

0

我不知道是否有實現這一目標使用匿名類型的可行方法。但我有一個建議,將在WinForms中工作,但我不確定ASP.NET。

你需要的是既沒有屬性的屬性的名稱數量,也沒有類型,並在編譯時已知性質的類型。一種創建這種東西的方法是ICustomTypeDescriptor

你必須創建一個類實現與支持該查詢從查詢​​一行返回的屬性對象的私人後備存儲這個接口。然後你實現GetProperties()返回一個PropertyDescriptor每列和PropertyDescriptor.GetValue()PropertyDescriptor.SetValue()訪問支持數組。

通過實施PropertyDescriptor.Name你會得到正確的列名;這可能需要另一個後臺存儲存儲屬性名稱。還有很多要實現,但最終你的新類型將表現得幾乎像一個正常的類型 - 現在如果 - 如果你綁定的控件知道並使用ICustomTypeDescriptor

UPDATE

我剛剛找到的文本的位,說明ASP.NET數據綁定知道並使用ICustomTypeDescriptor

+0

@丹尼爾有趣的建議 - 事實證明,解決方案更簡單,見我自己的答案。 – cdonner 2009-09-24 18:10:52

0

斯科特先前的帖子中關於塑造的結果插入到前柵格設置一系列會談:

Part 3 - Querying our Database

向下滾動到「塑造我們的查詢結果」。

+0

我也閱讀了這部分內容,這正是我的困惑所在 - 在這一部分中,他使用內聯查詢將匿名類型綁定到網格,對於內聯查詢非常適用,但是當您遵循他的建議時,方法會崩潰從第9部分擴展DataContext。 – cdonner 2009-09-26 11:06:52