Нужно заставить работать строку DynamicQueryable.OrderBy при iqueryable — выведенном из DataTable.
При iqueryable — выведенном из List<MyObject> — всё OK, а при DataTable — выдаёт ошибку "No property or field 'Column1' exists in type 'DataRow'"
Раз возникает ошибка "No property or field 'Column1' exists in type 'DataRow'", то попробовал создать класс-обёртку для DataRow, который реализует ICustomTypeDescriptor (и ещё класс, реализующий PropertyDescriptor). Но его методы не дёргались.
Тогда я подумал, что Linq не использует ICustomTypeDescriptor и попробовал другую обёртку на основе DynamicObject, но и его методы не дёргались.
Так вот: как бы создать класс-обёртку для этого случая, которая с динамическим набором свойств?
DynamicQueryable.OrderBy(...) — вызывается в сторонней библиотеке (посмотрел через Reflector)
нужно подсунуть ей DataTable или какую-то обёртку, при этом колонки в момент компиляции неизвестны.
Здравствуйте, Аноним, Вы писали:
А>DynamicQueryable.OrderBy(...) — вызывается в сторонней библиотеке (посмотрел через Reflector) А>нужно подсунуть ей DataTable или какую-то обёртку, при этом колонки в момент компиляции неизвестны.
Здравствуйте, Lloyd, Вы писали:
L>Я не знаю, что такое DynamicQueryable
Я тоже не знал. Оказалось, это такой велосипед для сборки LINQ запросов в рантайме.
Re[4]: [Linq] + DataTable
От:
Аноним
Дата:
26.09.11 10:58
Оценка:
Здравствуйте, Lloyd
Извиняюсь, я думал, что DynamicQueryable -это стандартная библиотека.
В итоге причину нашёл в недрах DynamicQueryable:
MemberInfo[] members = myObjectType.FindMembers(MemberTypes.Field | MemberTypes.Property, bindingAttr, Type.FilterNameIgnoreCase, (object)memberName);
Если myObjectType — некоторый тип с набором свойств, то этот код возвращает свойство с именем memberName.
Если же myObjectType — DataRow, то у него нет свойства memberName, а есть колонка memberName.
Можно ли как-то подменять DataRow на свой объект со свойствами, созданными по колонкам таблицы.
Т.е. что бы при выполнении этого кода возвращалось описание колонки.
Можно конечно обойти это через выдирание исходников через Reflection + правка и сборка новой библиотеки.
Оказалось, что Dynamic LINQ (он же DynamicQueryable) поддерживает создание объектов анонимных классов в Select(str).
Например:
var list2 = Data.AsEnumerable().AsQueryable()
.Select("new (it["Column1"] AS Column1, it["Column2"] AS Column2)");
Таким образом получаем:
StringBuilder sb = new StringBuilder();
foreach (DataColumn c in this.QueryResultData.DataSource.Columns)
{
if (sb.Length == 0)
sb.Append("new (");
else
sb.Append(", ");
sb.Append("it[\"" + c.ColumnName + "\"]");
sb.Append(" AS ").Append(c.ColumnName);
}
sb.Append(")");
var list = this.QueryResultData.DataSource.AsEnumerable().AsQueryable()
.Select(sb.ToString());
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Lloyd
А>Оказалось, что Dynamic LINQ (он же DynamicQueryable) поддерживает создание объектов анонимных классов в Select(str).