Объединенный запрос Linq к DataTable и результат к DataView

У меня есть две таблицы данных, элементы и группы. У меня есть запрос linq, чтобы получить имя элемента и его имя группы путем объединения двух таблиц.

    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 ответа

Проблема в том, что ваш запрос возвращает IEnumerable<T> анонимного типа, и вы не можете просто привести это к EnumerableRowCollection<DataRow>

Теперь я уверен, какой тип Grid вы используете (например, из winforms? WPF? ASP? ASP MVC? И т. Д.), Однако я ожидаю, что вы на самом деле сможете передать ему IEnumerable вывод linq-запроса, если хотите к - например:

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 не привязана к источнику данных.

Вы возвращаете список 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;
Другие вопросы по тегам