2011-03-17 50 views
0

我正在使用實體框架4.0。我想在運行時使用LINQ查詢從我的數據庫中的表創建一個DataTable。這裏是一個代碼:從對象類型創建數據表LINQ

var result = from r in DbContext.People.AsEnumerable() 
     select new { r.PersonID, r.FirstName, r.LastName }; 

我在我的結果變量中獲取數據。

IEnumerable<DataRow> drs = result as IEnumerable<DataRow>; // This line returns null 

我沒有在drs變量中獲取datarows。在完成上述操作後,我怎樣才能使用datatable的LoadDataRow()方法創建datatable。

請讓我知道我在做什麼錯在這裏。

在此先感謝

+1

Google是你的朋友:http://www.c-sharpcorner.com/UploadFile/VIMAL.LAKHERA/LINQResultsetToDatatable06242008042629AM/LINQResultsetToDatatable.aspx – codymanix 2011-03-17 15:50:47

+0

+1好評 – 2011-03-17 16:02:50

回答

2

通過這樣做:

select new { r.PersonID, r.FirstName, r.LastName }; 

你讓一個匿名類型。這不是DataRow,這就是您的轉換失敗的原因。

您需要製作新的DataTable,然後使用存儲在result中的結果填充(在foreach循環或類似環境中)。您不能直接將其轉換爲DataRow

1

result不會是DataRows的枚舉類型;它將是一個匿名類型的枚舉類型,在任何情況下都不會明確地轉換爲DataRow。要將匿名類型轉換爲DataRow,必須首先使用列名創建DataTable,然後爲每個匿名類型實例添加一個新的DataRow到DataTable。您不能顯式實例化新的DataRows; DataRow對象的結構完全依賴於它的父級DataTable。

1

首先,我假設,DbContext是EF4上下文到數據庫。那麼首先,你不需要調用AsEnumerable()方法,只需簡單地查詢People表。

其次,您將返回匿名類型,而不是DataRow。從EF4查詢返回時,您可以簡單地返回r變量,它將成爲People類的實例,您可以在程序中進一步使用它。如果您需要DataRow您需要手工創建它,但如果可能的話,我會建議堅持使用由EF4創建的對象。

畢竟,請記住,在查詢數據庫時,延遲執行發生。這意味着,在您將在foreach循環中使用該查詢之前,該查詢不會運行,或者在此結果上調用一些方法,如First,SingleToList()。如果您立即需要您的結果,請在查詢結束處添加ToList()