Объединенный запрос 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, то в блоге есть сообщения о том, как их создать, попробуйте:
- http://www.c-sharpcorner.com/UploadFile/VIMAL.LAKHERA/LINQResultsetToDatatable06242008042629AM/LINQResultsetToDatatable.aspx
- http://www.chinhdo.com/20090402/convert-list-to-datatable/
- http://wpfguy.blogspot.com/2009/07/how-to-convert-ienumerable-to.html
Обратите внимание, что если вы ожидаете использовать сетку для двустороннего связывания (например, для записи изменений обратно в базу данных), то это вряд ли "просто сработает" - поскольку ваша проекция 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;