2011-09-08 145 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;