2011-04-13 4 views
3

모두,동적 순서 비트를 사용하여 페이징/페이지 매김을위한 Linq 식

표를 사용하여 페이징을 처리하려고합니다. 이렇게하기 위해서, 필자는 어떤 필드를 정렬해야 하는지를 전달해야합니다. Linq 쿼리를 사용하여이 작업을 수행하는 방법을 알아낼 수 없습니다. NET 4/EF 4.1을 사용하고 있습니다. 아래의 두 예제에서 # 1은 정상적으로 작동합니다. 문제는 필자가 정렬 기준을 사용하여 필드를 전달하기 때문에 정렬 기준을 동적으로 변경할 수 있어야한다는 것입니다. 예제 2에서와 같이 문자열을 사용하려고하면 내 식으로 정렬되지 않습니다. 이것을 달성 할 방법이 있습니까? 많은 사람들이이 기능을 필요로하는 것 같습니다.

[Example 1] 
(from e in _context.MyEntity 
where (MyWhereClause) 
orderby e.SomeProperty Ascending 
select e).Skip(Offset).Take(MyCountPerPage); 

    [Example 2] 
(from e in _context.MyEntity 
where (MyWhereClause) 
orderby "SomeField, ASC" 
select e).Skip(Offset).Take(MyCountPerPage); 

-Thanks-

+0

가능한 [Dynamic LINQ OrderBy] 중복 (http://stackoverflow.com/questions/41244/dynamic-linq-orderby) –

답변

-2
var query = (from e in _context.MyEntity 
    where (MyWhereClause) 
    orderby e.SomeProperty Ascending 
    select e).Skip(Offset).Take(MyCountPerPage); 

    if(Ascendingflag) 
     query = query.OrderBy(a = > SortExpression); 
    else 
     query = query.OrderByDescending(a = > SortExpression); 
1

첫째, 당신은 확장 메서드 버전을 쿼리에서 당신의 ORDERBY를 끌어와 사용할 수 있습니다

var query = from e in _context.MyEntity 
      where (MyWhereClause) 
      select e; 

query = query.DynamicOrderBy("property"); 

query = query.Skip(Offset).Take(MyCountPerPage); 

다음으로 우리는 DynamicOrderBy을 작성해야합니다. 쿼리가 일종의 IQueryable<T>.

//Need this to construct the query correctly 
static MethodInfo s_orderBy = typeof(Queryable).GetMethods().First(m => m.Name == "OrderBy"); 

static IOrderedQueryable<T> DynamicOrderBy<T>(this IQueryable<T> source, string property) 
{ 
    var expr = source.Expression; 
    var p = Expression.Parameter(typeof(T), "x"); 
    var propInfo = typeof(T).GetProperty(property, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); 
    var sortExpr = Expression.Lambda(Expression.Property(p, propInfo), p) 
    var method = s_orderBy.MakeGenericMethod(typeof(T), propInfo.PropertyType); 
    var call = Expression.Call(method, expr, sortExpr); 
    var newQuery = source.Provider.CreateQuery<T>(call); 
    return newQuery as IOrderedQueryable<T>; 
} 
0

나는 이것을 jqGrid에 필요하다고 가정한다. 전 the answer 전에 VS2008 project으로 게시했습니다. 예제로 사용할 수 있습니다.

기본 아이디어는 "SomeField, ASC"와 같은 정렬을 지원하는 ObjectQuery<T>으로 Entity Framwork를 사용할 수 있다는 것입니다. 따라서 당신은 없이 동적 LINQ 확장없이 필요한 모든 것을 구현할 수 있습니다. 더욱 당신이 WHERE 가진 문자열 인수로

.Where("it.equipmentID < @maxId", new ObjectParameter ("maxId", 100)) 

같은 구성을 사용할 수 있습니다 (here 참조) ("it.equipmentID < @maxId"). 따라서 jqGrid에 필요한 문자열 인수를 사용하여 모든 페이징, 정렬 및 필터링을 구현할 수 있습니다. 내 대답을 시작한 예제는 어떻게 할 수 있는지 보여줍니다.