2011-09-08 98 views
2

我有兩個DataTables,項目和它的組。我有一個LINQ查詢通過加入2個表來獲取項目名稱和它的組名。加入Linq查詢DataTable和結果DataView

EnumerableRowCollection<DataRow> dvquery = (from item in Items.AsEnumerable() 
                  join grp in groups.AsEnumerable() 
                   on item.Field<byte>("Group_ID") equals grp.Field<byte>("ID") 
                   into item_grp_join 
                   from itemgrp in item_grp_join 
                   select new 
                   { 
                    ItemName = (string)led.Field<string>("Name"), 
                    GName = (string)itemgrp.Field<string>("Name"), 
                   }); 

      DataView dv = dvquery.AsDataView(); 

但是我收到編譯時錯誤作爲

無法隱式轉換類型「System.Collections.Generic.IEnumerable」到「System.Data.EnumerableRowCollection」。存在明顯的轉換(您是否缺少演員?)

如何解決此錯誤?我可以很容易地將查詢結果轉換爲列表,但我只需要一個數據視圖,因爲我可以將它作爲數據源提供給網格。

任何幫助表示讚賞。 感謝

+0

經歷了同樣的問題,感謝張貼。 – Pat

回答

4

的問題是,您的查詢將返回一個匿名類型的IEnumerable<T>,你不能簡單的強制轉換成一個EnumerableRowCollection<DataRow>

我現在相信你正在使用哪種類型的網格(例如,從的WinForms ????WPF ASP ASP MVC等),但我希望,你應該真正能夠通過它的LINQ查詢的IEnumerable的輸出,如果你想 - 例如:

var query = (from item in Items.AsEnumerable() 
      join grp in groups.AsEnumerable() 
      on item.Field<byte>("Group_ID") equals grp.Field<byte>("ID") 
      into item_grp_join 
      from itemgrp in item_grp_join 
      select new 
      { 
       ItemName = (string)led.Field<string>("Name"), 
       GName = (string)itemgrp.Field<string>("Name"), 
      }); 
grid.DataSource = query; // or possible query.ToList() as you suggest in the question! 

如果你真的需要使用DataView類型對象,然後有關於如何創建這些對象的博客文章,請嘗試:

請注意,如果你期望使用網格爲雙向綁定(例如用於將更改寫回數據庫),那麼這不太可能「正常工作」 - 因爲您的IEnumerable投影未綁定到數據源。

+0

您提到的所有上述參考文獻首先將查詢轉換爲數據表,然後可以設置datatable上的dataview。我認爲這是唯一的選擇。如果我在由Linq查詢生成的Datatable上設置dataview,然後以某種方式破壞DataTable。 DataView能工作嗎? – Hakim

1

您正在返回anonymous對象的列表。最好從查詢結果中創建一個DataTable。

var query = (from item in Items.AsEnumerable() ....... 

DataTable view = new DataTable(); 
view.Columns.Add("GroupName"); 
view.Columns.Add("ItemName"); 
foreach (var t in dvquery) 
     { 
     view.Rows.Add(t.GName, t.ItemName); 
     } 
DataView dv = view.DefaultView;