Проблема динамической сортировки LInq-to-sql - PullRequest
0 голосов
/ 27 января 2010

У меня есть запрос linq-to-sql над сущностью, у которой есть дочерний набор сущностей, который мне нужно отсортировать по некоторым дочерним полям, т.е. использовать этот запрос:

   var query = from p in context.Patients 
            let order = p.Lab_Orders.First() 
            orderby order.Order_Date 
            select p; 

Этот запрос работает нормально, но как мне изменить его, чтобы использовать метод OrderBy DLINQ, что бы я передавал в качестве параметра сортировки во время выполнения?

Ответы [ 3 ]

1 голос
/ 27 января 2010

Если под DLINQ вы имеете в виду динамический запрос, то вы не можете использовать такие выражения запроса, вы должны использовать методы расширения с лямбдами. Вы можете начать с выражения запроса, но вы должны в конечном итоге переключить его на лямбду:

IEnumerable<Patient> GetPatients(string orderSortField)
{
    var query =
        from p in context.Patients
        select new
        {
            Patient = p,
            FirstOrder = p.Lab_Orders.First()
        };
    return p.OrderBy(orderSortField).Select(p => p.Patient);
}

Позвоните с помощью:

var patientsByOrderDate = GetPatients("FirstOrder.Order_Date");
0 голосов
/ 27 января 2010

Использовать AsQueryable () после начального оператора -

var query = from p in context.Patients
            let order = p.Lab_Orders.First()        
            select p; 

query = query.AsQueryable().OrderBy(x => x.Lab_Orders.First().OrderDate);
0 голосов
/ 27 января 2010

Попробуйте добавить «OrderBy» в дерево выражений:

var query = from p in context.Patients 
            let order = p.Lab_Orders.First() 
            select p; 
var x = Expression.Parameter(query.ElementType, "x");
string sortName = "order.Order_Date";
var selector = Expression.Lambda(Expression.PropertyOrField(x, sortName), x);
query = query.Provider.CreateQuery(
         Expression.Call(typeof(Queryable), "OrderBy", 
              new Type[] { query.ElementType, selector.Body.Type },
               query.Expression, selector)
         ) as IQueryable<Patients>;

Требуется пространство имен "System.Linq.Expressions".

...