2016-10-07 2 views
1

Я не знаю, как сделать динамический запрос Linq.Linq dynamic orderby not working

Это работает:

var query = from article in context.DP_ARTICLES 
      orderby article.ART_NUM descending 
      select new ArticleItem() { Article = article }; 

Но это не работает:

var query = from article in context.DP_ARTICLES 
      orderby("ART_NUM DESC") 
      select new ArticleItem() { Article = article }; 

EDIT:

Цель состоит в том, чтобы заказать ListView столбцы, так что в моем методе я получаю Имя столбца sql в качестве параметра строки (например, ART_NUM). Поэтому лучше всего использовать его непосредственно в моем запросе вместо сделать переключатель ...

+0

https://dynamiclinq.codeplex.com/ – dasblinkenlight

+0

Договорились, что, вероятно, не компилируется. Вы не можете использовать строковые литералы для идентификации поля. –

+3

Почему вы ожидаете, что это сработает? – mybirthname

ответ

2

Динамические методы работают только при использовании методы синтаксиса вызовов, он не будет работать при использовании синтаксиса запросов.

var query = context.DP_ARTICLES 
    .OrderBy("ART_NUM DESC") 
    .Select(a => new ArticleItem { Article = a }); 
+0

Вы действительно пробовали? Я использовал успешный пример, используя синтаксис запроса. – codeConcussion

+1

Если бы вы просто передали строку в синтаксисе запроса, ничего бы не произошло, поскольку вы сортируете с использованием константы. это фактически так же, как если бы вы назвали его «.OrderBy (e =>« ART_NUM DESC »)' или даже '.OrderBy (e => 1)'. –

+0

Дох, конечно. Я был так потрясен, что даже принял синтаксис, я не обратил внимания на то, что он действительно не сортировал правильно. – codeConcussion

0

Вам нужно изменить

orderby("ART_NUM DESC")

в

orderby article.ART_NUM descending

в OrderBy Безразлично» t принимает строковые литералы.

+0

Это действительно интересно, я сам на самом деле не пробовал. Вы пробовали его с точным (или очень похожим) синтаксисом, который использовал OP? – Dillanm

+1

ОК, я толчок. Я был просто удивлен, что он принял синтаксис, но он фактически не выполняет сортировку правильно. – codeConcussion

+0

Говоря о Linq.Dynamic.OrderBy здесь, не стандартный Linq.OrderBy, который принимает строку – Ian

1

если запрос основан на предикате, то вы можете сделать следующее:

var query = context.DP_ARTICLES; 

if(predicate) 
    query= query.OrderBy(article => article.ART_NUM).AsQueryable(); 
else if(predicate2) 
    query = //Second Order by clause 
.... //More sort options 
else 
    //Default action if needed 

var results = query.select(article => new ArticleItem 
             { 
              Article = article 
             }).ToList(); 
+0

Примечание: сначала OrderBy вернет OrderedEnumerable , а расширение OrderBy хочет Queryable . –

+0

@JanneMatikainen обновлен, чтобы вернуть запрос –