Объединенный запрос Linq к DataTable и результат к DataView - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть две таблицы данных, элементы и группы. У меня есть запрос 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 ]

4 голосов
/ 08 сентября 2011

Проблема в том, что ваш запрос возвращает 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 не привязана к DataSource.

1 голос
/ 08 сентября 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;
...