2009-12-02 44 views
1

我正嘗試查詢DataTable對象沒有指定領域,像這樣:LINQ到數據表中列舉無田

var linqdata = from ItemA in ItemData.AsEnumerable() 
select ItemA 

但返回類型爲

System.Data.EnumerableRowCollection<System.Data.DataRow> 

,我需要以下返回類型

System.Data.EnumerableRowCollection<<object,object>> 

(像標準匿名型)

有什麼想法? 謝謝

回答

4

如果我正確地理解了你,你想獲得你不需要在你的代碼中定義的對象集合,但它們可以以強類型的方式使用。可悲的是,不,你不能。

匿名類型似乎是某種變種動態對象的,但它實際上是在編譯時定義一個強類型的類。 .NET在後臺自動爲你定義類型。爲了.net能夠做到這一點,它必須從代碼中得出一些線索來推斷類型定義。它必須有這樣的東西:

from ItemA in ItemData.AsEnumerable() 
select ItemA.Item("Name"), ItemA.Item("Email") 

所以它知道什麼成員定義。沒有辦法繞過它,信息必須邏輯地在那裏定義匿名類型。

根據您爲什麼要嘗試這樣做,有一些選項。

  • 如果你想智能感知,同時還封裝數據訪問,您可以從封裝的數據訪問類返回DataTable的XML來代替。 (你可以很容易地將數據錶轉換爲xml,你可以使用新的System.Xml.Linq類,如XElement,它們很棒!)然後你可以使用VS2008從xml創建一個xsd模式。然後使用/導入該模式在您的代碼頁的頂部,並且您具有智能感知。
  • 如果你必須有一個對象一個與您的數據屬性,但不希望爲它們定義一個類/結構,你一定會喜歡新動態對象未來在C#4.0/VB10 。你有基於SQL返回的對象屬性,但你不會有智能感知。這還有一個性能成本,但是(a)這對你的情況可能並不重要,(b)在某些情況下實際情況並不那麼糟糕。
  • 如果您只是想避免製作很多類,請考慮在類定義下的相同代碼文件中定義結構/結構。當您向結果集添加更多列時,使用更多公共字段可以輕鬆調整結構。

總之你可以有以下三種的任意:(a)中的動態,(b)中strontly類型對象,(3)的智能感知。但不是全部三個。

+0

+1匿名類型並不意味着「無型」或「動態」,它只是意味着該類型不明確的代碼表示。 – 2010-04-13 03:36:24

+0

@Kirk謝謝!我想我在這裏給出了一個很好的透徹答案,但是直到你纔看到沒有人注意到。 :) – 2010-04-13 09:57:08

0

有一種方法可以實現你想要的,但它需要知道動態linq。您將在運行時構建查詢,然後使用它。我不是專家,從來沒有真正玩過它,但是這裏有一個鏈接到Scott Guthrie的博客 - Dynamic Linq。希望有所幫助。

韋德