我编写了一个页面,它使用Linq查询数据库并将生成的IQueryable绑定到数据网格。我有一个部分类,它包含额外的属性,这些属性根据从数据库中引入的其他值派生它们的值。
排序适用于实际位于数据库中但不适用于派生字段的字段。当我尝试对这样的字段进行排序时,我收到一条错误消息“会员'Trip.Difference'没有支持的SQL转换。
知道如何在这些派生字段上进行排序吗?
答案 0 :(得分:0)
问题是你绑定到IQueryable
,所以每次枚举它时,你都会将IQueryable
上的LINQ表达式转换为SQL语句并返回数据库来执行它。
如果您尝试对未绑定到数据库模型的属性进行排序,那么您将收到提到的错误,因为这些属性仅在从数据行创建对象后才存在。
最简单的解决方案是在ToList()
上调用IQueryable
,然后再将其用于排序和数据绑定,以便对实际可用属性的内存中对象进行排序。 ToList()
会将您的IQueryable
转换为IEnumerable
(通过List<T>
),并阻止它再次通过LINQ to SQL转到数据库。
这通常是一个很好的设计模式 - 你想要的最后一件事是你的业务层的消费者能够无意中对你的数据库执行任意查询,只是因为你返回了IQueryable
你应该返回的地方{ {1}}。
答案 1 :(得分:0)
首先调用ToEnumerable(),然后添加OrderBy:
var q = (from a in mDataContext.Somethings()
select a).ToEnumerable().OrderBy...