1

给定一个父级和一个有效的列名,我想找到所有相关的子级,按动态列名排序。这是我认为我的代码的样子:

Parent.                                             // EntityObject
Children.                                           // EntityCollection
Where(c => c.Gender == 'm').                        // IEnumerable
OrderBy(columnName, ListSortDirection.Ascending).   // -- not available --
Skip(pages * pageSize).Take(pageSize);

IEnumerable.OrderBy(string columnName) 不存在。环顾四周以完成“按动态列名排序”,我从这个看起来很棒的解决方案开始:如何为运行时排序创建表达式树?,但这在 IQueryable 上运行

如果是这样,我认为它会将记录通过网络进行排序并降低我的寻呼机的性能。所以我重新排序:

Repository.                                         // Repository
Children.                                           // ObjectSet
Where(c => c.Parent == Parent && c.Gender == 'm').  // ObjectQuery, runtime error
OrderBy(columnName, ListSortDirection.Ascending).   // IOrderedQueryable
Skip(pages * pageSize).Take(pageSize);

ObjectSet 和 ObjectQuery 实现 OrderBy(string columnName),并且此代码编译,但产生错误:

无法创建类型为“DataModel.Parent”的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。

当然,我可以获取父ID,但是Child.ParentReference也是非原始类型。

我可以想到几种方法可以通过网络加载整个记录集,但我觉得我一定遗漏了一些东西,因为使用所有 MS 将一组基本指令传递到数据库一定不难以技术为中心。

编辑:假装我是http://en.wikipedia.org/wiki/Quiverfull,需要给我的孩子分页。:) edit2:澄清了我需要查询动态列名。

4

3 回答 3

1
var parents = db.Parents; // Do whatever you need to get your unsorted collection from EF here.

if (sortBy == "Gender")
{
    parents = parents.OrderBy(p => p.Gender);
}
else if (sortBy == "FirstName")
{
    parents = parents.OrderBy(p => p.FirstName);
}

现在,这显然不是在多列上排序,只是在单列上。您还可以为排序方向添加更多逻辑。

编辑:拿出关于 PredicateBuilder 的废话,当我开始输入这个答案时,我走错了路,忘了拿出旧的东西。

于 2012-08-09T22:26:56.043 回答
0

尝试更换您的 OrderBy

OrderBy("age", ListSortDirection.Ascending).

OrderBy(x => x.Age).

还有哪里

Where(c => c.Parent == Parent && c.Gender = 'm').

应该读

Where(c => c.Parent == Parent && c.Gender == 'm').
于 2012-08-09T21:58:16.573 回答
0

所以我遇到了几个问题,都在问题标题中提到。

按运行时选择的或动态的列名排序需要一些表达式构建。我在这里使用了@Slace 的流行扩展方法。

这需要一个 IQueryable。IQueryable 对我有用,因为每次我不小心将查询转换为可枚举时,我当然会在分页之前通过网络将所有结果带回,这是我试图避免的。但是我仍然需要一种方法来获取与我已经持有的实体有关系的结果的 IQueryable。

这很简单,我忽略了,只是加入 Entity.Id 工作,并没有导致数据源的冗余连接。不像我对 EF 所期望的那样面向对象,但它会做到的。

Repository.                                         // Repository
Children.                                           // ObjectSet
Where(c => c.Parent.Id == Parent.Id).               // ObjectQuery, works fine
OrderBy(columnName, ListSortDirection.Ascending).   // IOrderedQueryable
Skip(pages * pageSize).Take(pageSize);              // Only transfers 1 page
于 2012-08-13T20:46:57.913 回答