Присоединил запрос 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. Существует явное преобразование (вам не хватает приведения?)

Как решить эту ошибку? Я могу легко преобразовать результат запроса в список, но мне нужно только представление данных, чтобы я мог передать его в качестве источника данных для сетки.

Любая помощь приветствуется. Спасибо


person Hakim    schedule 08.09.2011    source источник
comment
Столкнулся с такой же проблемой, спасибо за публикацию.   -  person Pat    schedule 16.07.2015
comment
Этот запрос LINQ возвращает IEnumerable, и если вы хотите, чтобы он возвращал EnumerableRowCollection, который вы можете просто выполнить .AsDataView(), вам просто нужно выполнить элемент SELECT (весь объект не анонимного типа). Надеюсь, это поможет кому-то еще   -  person kuklei    schedule 11.04.2020


Ответы (2)


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

Теперь я уверен, какой тип сетки вы используете (например, из 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 не привязана к источнику данных.

person Stuart    schedule 08.09.2011
comment
Все упомянутые выше ссылки сначала преобразуют запрос в таблицу данных, а затем можно установить представление данных в таблице данных. Я думаю, тогда это единственный оставшийся вариант. Что, если я установлю представление данных в Datatable, которое было сгенерировано запросом Linq, а затем каким-то образом DataTable будет уничтожен. Будет ли тогда работать DataView? - person Hakim; 09.09.2011

Вы возвращаете список 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;
person kv-prajapati    schedule 08.09.2011