将Linq查询连接到DataTable并将结果连接到DataView

时间:2011-09-08 12:13:00

标签: c# linq dataview

我有两个DataTables,Items及其Groups。我有一个linq查询,通过加入2个表来获取项目名称及其组名。

    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'。存在明确的转换(您是否错过了演员?)

如何解决此错误?我可以轻松地将查询结果转换为列表,但我只需要一个数据视图,因此我可以将其作为数据源提供给网格。

任何帮助表示赞赏。 感谢

2 个答案:

答案 0 :(得分: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投影没有绑定到数据源。

答案 1 :(得分: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;