LINQ: Как динамически использовать ORDER BY в linq, но только если переменная не является string.empty или null - PullRequest
3 голосов
/ 25 ноября 2010

Я использую LINQ2SQL, и он работает довольно хорошо. Однако, в зависимости от значения строки типа переменной в C #, мне нужно использовать «Order By» в моем запросе или не использовать «order by».

Если строка C # НЕ пуста или пуста, то я хочу "упорядочить по" содержимому строковой переменной. Если строка C # пуста или равна нулю, я не включаю порядок по.

Можно ли написать запрос такого типа?

Ответы [ 3 ]

2 голосов
/ 25 ноября 2010

Делайте то же самое в ответе VVS, но если вы хотите передать имя столбца для упорядочивания, вы можете использовать этот метод расширения вместо встроенного метода OrderBy:

public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string memberName)  
{  
    ParameterExpression[] typeParams = new ParameterExpression[] { Expression.Parameter(typeof(T), "") };  

    System.Reflection.PropertyInfo pi = typeof(T).GetProperty(memberName);  

    return (IOrderedQueryable<T>)query.Provider.CreateQuery(  
        Expression.Call(  
            typeof(Queryable),  
            "OrderBy",  
            new Type[] { typeof(T), pi.PropertyType },  
            query.Expression,  
            Expression.Lambda(Expression.Property(typeParams[0], pi), typeParams))  
    );  
} 
2 голосов
/ 25 ноября 2010

Сделайте это в два этапа:

var query = from .. in .. where .. select ..;

if (!string.IsNullOrEmpty(someVariable))
{
    query = query.OrderBy((..) => ..);
}
0 голосов
/ 25 ноября 2010

Сделайте так, чтобы C # проверял содержимое списка, и выполняйте заказ, только если он не содержит ноль.

var myList = (from s in dataContect.Users select s).ToList();

bool containsNull = false;

foreach (var item in mylist)
{
    if (string.IsNullOrEmpty(item.LastName))
    {
        containsNull = true;
    }
}

if (!containsNull)
{
    // If is not contains null, Use Order By
    myList = myList.OrderBy(k => k....);
}
...