首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq-to-Entities动态排序

Linq-to-Entities动态排序
EN

Stack Overflow用户
提问于 2010-05-01 03:29:48
回答 5查看 20.3K关注 0票数 18

这是我的查询,如何使用字符串作为orderby参数?

代码语言:javascript
复制
string sortColumn="Title";

var  items = (from ltem in ctxModel.Items
              where ltem.ItemID == vId
              orderby //something here
              select ltem).Skip(PageSize * PageIndex).Take(PageSize);

更新:

我不能简单地对结果集进行分页,因为我首先需要排序,然后才需要OrderBy。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-01 04:01:50

其他人建议使用动态链接或其他库。就我个人而言,,我不会为这么小的任务引入库依赖。但你可以选择的另外两条路径是...

  • 使用对象调用语法并动态构建查询表达式树。例如...

请参阅http://blog.cincura.net/229310-sorting-in-iqueryable-using-string-as-column-name/

在这种情况下考虑Deferred Execution是很重要的。您可以安全地生成返回IQueryable对象的查询,然后对该对象运行对象查询排序。当实际访问数据时,您的查询将只运行一次。

上面的博客文章是一个示例,展示了如何使用Expression API来构建可用于OrderBy的表达式树。这听起来真的很复杂。MSDN文章可能是更好的参考。请参阅MSDN上的How to: Use Expression Trees to Build Dynamic Queries

  • 使用简单的路由,并且只在整个查询的标题上使用一个开关。

例如:

代码语言:javascript
复制
ItemType items = default(ItemType);
switch(sortColumn)
{
     case "Title":
     {
           items = ctxModel.Items
                    .Where(i => i.ItemID == vId)
                    .OrderBy( i => i.Title);
     }
     break;
 }
票数 6
EN

Stack Overflow用户

发布于 2013-03-21 00:00:17

我使用这个帮助器:

代码语言:javascript
复制
public static class OrderExt
{
    private static IOrderedQueryable<T> Order<T>(this IQueryable<T> source, string propertyName, SortDirection descending, bool anotherLevel = false)
    {
        var param = Expression.Parameter(typeof(T), string.Empty);
        var property = Expression.PropertyOrField(param, propertyName);
        var sort = Expression.Lambda(property, param);

        var call = Expression.Call(
            typeof (Queryable),
            (!anotherLevel ? "OrderBy" : "ThenBy") +
            (descending == SortDirection.Descending ? "Descending" : string.Empty),
            new[] {typeof (T), property.Type},
            source.Expression,
            Expression.Quote(sort));

        return (IOrderedQueryable<T>)source.Provider.CreateQuery<T>(call);
    }
}

调用helper,例如这样做:

代码语言:javascript
复制
string sort = HttpContext.Current.Request.QueryString["sort"];
var products = _productRepository.OrderBy(sort, SortDirection.Ascending);
票数 14
EN

Stack Overflow用户

发布于 2010-05-01 04:57:17

这是另一种选择,EntitySorter。允许像dynamic LINQ那样处理字符串,但将操作包装在一个对象中,就像Query Object pattern一样。它允许按字符串和类型安全构造进行排序。下面是一些示例:

代码语言:javascript
复制
// Ways of defining an entity sorter
// 1. Using strings:
IEntitySorter<Person> sorter = EntitySorter<Person>
    .OrderBy("Address.City")
    .ThenByDescending("Id");

// 2. Defining a sorter with lambda's
IEntitySorter<Person> sorter = EntitySorter<Person>
    .OrderByDescending(p => p.Name)
    .ThenBy(p => p.Id)
    .ThenByDescending(p => p.Address.City);

// 3. Using a LINQ query
IEntitySorter<Person> sorter =
    from person in EntitySorter<Person>.AsQueryable()
    orderby person.Name descending, person.Address.City
    select person;

// And you can pass a sorter from your presentation layer
// to your business layer, and you business layer may look
// like this:
static Person[] GetAllPersons(IEntitySorter<Person> sorter)
{
    using (var db = ContextFactory.CreateContext())
    {
        IOrderedQueryable<Person> sortedList =
            sorter.Sort(db.Persons);

        return sortedList.ToArray();
    }
}

您可以找到代码here

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2747114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档