2016-10-07 45 views
1

我不知道如何制作一个动态的Linq查询。Linq动态命令不工作

这是工作:

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 }; 

编辑:

的目标是为了一个列表视图的列,所以在我的方法,我得到的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

Doh,当然。我非常震惊,甚至接受了我没有注意到它没有正确排序的事实。 – codeConcussion

0

您需要更改

orderby("ART_NUM DESC")

orderby article.ART_NUM descending

作为排序依据没有按” 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更新为可返回查询 –