我正在尝试为Devexpress MVC Gridview(Custom Binding Demo)实现大型数据库自定义绑定,但该项目不使用Entity Framework的DataContext,而是使用DataTable作为数据源。
转换为IQueryable的数据表不会在网格中呈现值,因为网格在使用.BindToCustomData()时需要POCO。
在List中包装DataTable的行会绑定值,但在分组或排序时会失败。
Expando Object方法相当远,但是当点击DevExpress.Data.Linq.CriteriaToExpressionConverter进行排序/分组等时,它失败,因为CriteriaToExpressionConverter似乎试图使用反射读取属性,导致Argument异常作为动态属性无法读取ExpandoObject。
有什么想法吗?
答案 0 :(得分:0)
不,您不应该使用DataTable进行DevExpress MVC自定义数据绑定。
我确实在这方面接触过DevExpress(优质服务),经过多次讨论后明确表示它只是要避免的事情。它不是如何设计控制并强制它是浪费时间。使用ORM并让他们的控制权完成繁重的任务。
以下是我的经历,任何人都像我一样疯狂地完成这项任务,并作为为什么这不起作用的证据。
1)你必须覆盖大量的样板(幸好它们提供了大量的样板,但我仍然需要做很多修改),这完全是你自己的维护和测试。
2)即使这样,你也无法直接绑定DataTable,它必须是Queryable类型。但DataTable.AsQuerable()返回IQueryable,它不能正确绑定,因为DataRow本质上是一个Dictionary而且它的列不是强类型的,因此它不会在网格中呈现任何值。 (我没有使用强类型数据表进行测试,请参阅第4点)
3)虽然使它成为ExpandoObject(动态)对象会使它绑定,但是你还需要覆盖它们的ICriteriaToExpressionConverter来处理在分组,排序,汇总时建立的System.Linq.Expressions.Expression。
4)你需要一个强类型对象来摆脱第2点和第3点,但你也可以解决第1点。
底线:不要将DataTable与DevExpress自定义数据绑定一起使用;