2010-02-16 39 views
0

我写了一个页面,它使用Linq查询数据库并将生成的IQueryable绑定到数据网格。我有一个部分类,它包含额外的属性,这些属性根据从数据库中引入的其他值导出它们的值。如何基于派生字段对Linq对象的gridview进行排序?

排序对实际位于数据库中但不包含派生字段的字段正常工作。当我尝试排序这样一个领域,我得到一个错误说“成员‘Trip.Difference’没有支持转换为SQL。

任何想法,如何让这些派生的字段排序?

回答

0

问题是您绑定到IQueryable,所以每次枚举它的时候,你要翻译的IQueryable的LINQ表达一个SQL语句,并要回数据库中执行它。

如果你想进行排序没有绑定到数据库模型的属性,那么你会得到提到的错误,因为这些属性只存在一旦一个对象已经从一个dat一排。

最简单的解决方案是在将用于排序和数据绑定之前调用ToList(),以便对内存中实际可用的对象进行排序。 ToList()将您的IQueryable转换为IEnumerable(通过List<T>),并阻止它再次通过LINQ to SQL进入数据库。

这通常是一个好的设计模式可供遵循 - 你想要的最后一件事是你的业务层的消费者能够在不知不觉中对数据库执行任意查询,仅仅是因为你返回IQueryable,你应该已经回到IEnumerable

0

呼叫ToEnumerable(),然后再添加排序依据:

var q = (from a in mDataContext.Somethings() 
     select a).ToEnumerable().OrderBy... 
+0

会调用.ToEnumerable使得从数据库读取的对象呢?该表格有600,000条记录,我希望避免在分页应用之前检索它们。 – DJCasey 2010-02-16 05:12:21

相关问题