Linq-to-Entities动态排序

c# entity-framework linq

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

string sortColumn="Title";

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

更新:
我不能只是排序依据的结果集,因为我首先需要进行排序, 然后才是页。

一般承认的答案

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

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

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

在此方案中考虑延迟执行很重要。您可以安全地构建返回IQueryable对象的查询,然后对该对象运行对象查询排序。只有在实际访问数据时,您的查询才会运行一次。

上面的博客文章是一个示例,说明如何使用Expression API构建和表达树,您可以将其用于OrderBy 。这听起来真的很复杂。 MSDN文章可能是更好的参考。请参见如何:使用表达式树在MSDN上构建动态查询

要么

  • 使用简单路由,只需在整个查询的标题上使用开关即可。

例如。

ItemType items = default(ItemType);
switch(sortColumn)
{
     case "Title":
     {
           items = ctxModel.Items
                    .Where(i => i.ItemID == vId)
                    .OrderBy( i => i.Title);
     }
     break;
 }

热门答案

我用这个助手:

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);
    }
}

调用助手,例如:

string sort = HttpContext.Current.Request.QueryString["sort"];
var products = _productRepository.OrderBy(sort, SortDirection.Ascending);



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因