Создайте выражение OrderBy для LINQ / Lambda - PullRequest
14 голосов
/ 23 апреля 2011

Я создаю доказательство концепции, которая использует Lambda / LINQ для динамического где и упорядочения.Следующий код работает для выражения where, но я не могу понять, как создать порядок по выражению.Для этого примера, если возможно, я бы хотел, чтобы все было просто;Я бы предпочел не писать код, который модифицирует дерево выражений.

void Main()
{
    DateTime productSince = DateTime.UtcNow.Subtract(new TimeSpan(1,30,0));
    Expression<Func<Products, bool>> filter = d => d.CreatedDate > productSince && d.Price < 100 ;    
    List<Products> products = GetProducts(filter, Products);
    Console.WriteLine(products);
}

private static List<Products> GetProducts(Expression<Func<Products, bool>> filter,  Table<Products> Products)
{

    var products = Products.Where(filter);
    return products.ToList();
}

То, что я хочу, похоже на следующее, но я не могу понять код для создания заказа по выражению.

void Main()
{
    DateTime productSince = DateTime.UtcNow.Subtract(new TimeSpan(1,30,0));
    Expression<Func<Products, bool>> filter = d => d.CreatedDate > productSince && d.Price < 100 ;
    Expression<Func<Products, ????>> orderBy = d => ??????;

    List<Products> products = GetProducts(filter, orderBy, Products);
    Console.WriteLine(products);
}

private static List<Products> GetProducts(Expression<Func<Products, bool>> filter,
               Expression<Func<Products, ???>> orderBy, Table<Products> Products)
{

    var products = Products.Where(filter).OrderBy(orderBy);
    return products.ToList();
}

Если вам интересно, я использую LinqPadдля этого доказательства концепции.

Ответы [ 2 ]

19 голосов
/ 23 апреля 2011
private static List<Products> GetProducts<TOrderBy>(Expression<Func<Products, bool>> filter,
               Expression<Func<Products, TOrderBy>> orderBy, Table<Products> Products)
{

    var products = Products.Where(filter).OrderBy(orderBy);
    return products.ToList();
}

Если вы посмотрите на метод расширения OrderBy, он принимает Expression<Func<T, TOrderBy>>, потому что выражение может привести к любому типу в зависимости от

.OrderBy(x => x.ID) // <T, int>
.OrderBy(x => x.Name) // <T, string>

Таким образом, ваш метод-обертка должен иметь возможность принимать этот универсальный тип для передачи.

12 голосов
/ 21 ноября 2012

что вы ищете:

Expression<Func<Products, dynamic>>;

попробуйте создать структуру / класс, в котором будут содержаться как выражения, так и восходящие или нисходящие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...