2016-11-07 3 views
0

Я пытаюсь реализовать специальную привязку большой базы данных для Devexpress MVC Gridview (Custom Binding Demo), но проект не использует DataContext Entity Framework, а DataTable в качестве источника данных.Обязательное связывание данных Devexpress MVC с использованием DataTable

Datatable, преобразованный в IQueryable, не отображает значения в сетке, поскольку сетка ожидает POCO при использовании .BindToCustomData().

Обертка строк DataTable в списке связывает значения, но сбой при группировке или сортировке.

Подход Expando Object довольно далеко, но при попадании в DevExpress.Data.Linq.CriteriaToExpressionConverter для сортировки/группировки и т. Д. Он терпит неудачу, поскольку CriteriaToExpressionConverter, похоже, пытается считывать свойства с использованием отражения, вызывая исключение Argument как динамические свойства объекта ExpandoObject нельзя прочитать.

Любые идеи?

+0

Вы пробовали обратиться к поддержке DevExpress? –

ответ

0

Нет, вы не должны выполнять привязку данных пользовательских данных DevExpress MVC с использованием DataTable.

Я действительно обратился к DevExpress (отличный сервис) по этому поводу, и после нескольких обсуждений его стало ясно, что его просто следует избегать. Не то, как контроль был разработан и заставлял его тратить время. Используйте ОРМ и позволяйте своему контролю делать тяжелый подъем.

Следующее - это мой опыт для любого, как сумасшедшего, как я, с этой задачей и в качестве доказательства того, почему это не сработает.

1) Вам необходимо перезаписать большое количество шаблонов (к счастью, они обеспечивают основную часть его, но мне все равно пришлось внести много изменений), который тогда полностью ваш собственный, чтобы поддерживать и тестировать.

2) Даже тогда вы не можете привязывать DataTable напрямую, он должен быть типа Queryable. Но DataTable.AsQuerable() возвращает IQueryable, который не связывает корректность как DataRow, по сути, является словарем, а его столбцы не являются строго типизированными, поэтому он не отображает значения в сетке. (Я не тестировал с помощью строго типизированного типа данных, см. Пункт 4)

3) При создании объекта ExpandoObject (динамический) он будет привязан, но тогда вам также потребуется перезаписать их ICriteriaToExpressionConverter для обработки Системы .Linq.Expressions.Expression, которое создается при группировке, сортировке, суммировании.

4) Вы бы необходимо строго типизированный объект, чтобы избавиться от пунктов 2 и 3, но тогда вы бы также решить пункт 1.

Итог: Не используйте DataTable с окантовкой DevExpress пользовательских данных;