Linq To Sql - динамический OrderBy - случай, когда - PullRequest
5 голосов
/ 06 января 2010

Я использую Linq to sql и Linq Dynamic OrderBy.

Я знаю, что linq dynamic может выполнять простую сортировку, например - orderby ("column_name").

Но поддерживает ли он что-то более сложное, например запросы с "CASE WHEN" в них?

string orderbyQuery = "(CASE WHEN (username == 100) THEN 1 ELSE 0 END) DESC)";

вот мой запрос:

var u = from u in db.users
        orderby(orderbyQuery)
        select u;

приведенный выше пример не работает! Любая идея, если это возможно? любой другой способ сделать это?

спасибо

Ответы [ 3 ]

11 голосов
/ 06 января 2010
var u = from u in db.users
        orderby u.username == 100 ? 1 : 0 descending
        select u;
1 голос
/ 05 сентября 2011

Это действительно работает для меня:

var queryResult = 
   from o in Source
   orderby (o.ColumnThatSaysOrderByColumn1 ? o.Column1 : o.Column2) descending
   select o

Надеюсь, это поможет!

0 голосов
/ 03 июля 2019

Я создал метод расширения с такими функциями. он также работает с Entity Framework, передавая заказ в sql как ORDER BY CASE WHEN..THEN..

public static Expression<Func<TEntity, int>> CustomSortOrder<TEntity>(this IList<string> customSortOrderValues, string propName) {

var e = Expression.Parameter(typeof(TEntity), "e");
var prop = typeof(TEntity).GetProperty(propName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
var eDotProp = Expression.MakeMemberAccess(e, prop);
var maxLen = customSortOrderValues.Count;

Expression ElseExpression(IList<string> values) {
    var value = values[0];
    var condition = Expression.Equal(eDotProp, Expression.Constant(value));
    var ifTrue = Expression.Constant(maxLen - values.Count);
    Expression ifFalse ;

    if (values.Count == 1) {
        ifFalse = Expression.Constant(maxLen - values.Count + 1);
    }
    else {
        values.RemoveAt(0);
        ifFalse = ElseExpression(values);
    }
    return Expression.Condition(condition, ifTrue, ifFalse);
}

return Expression.Lambda<Func<TEntity, int>>(
    ElseExpression(customSortOrderValues),
    e);

}

и скажем, что наша модель:

public class Cat{
public string Name {get;set;}
public Cat(string name){
        Name = name;
}

использование ...

var cats = new List<Cat> { new Cat("cat1"), new Cat("cat2"), new Cat("cat3") };
var customSort = new List<string> { "cat2", "cat1", "cat3" }.CustomSortOrder<Cat>("Name");
var customOrderCats = cats.AsQueryable().OrderBy(customSort); // can work with Entity framework too //orders cat2,cat1,cat3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...