2013-09-24 35 views
0

我有一个名称,日期,类别为参数的集合。我想根据动态更改的三个输入顺序对列表进行排序。 例如:在一种情况下,我必须分别对订单日期,名称,类别进行排序。 在另一种情况下,订单是名称,日期和类别。所以我可以拥有所有的排列和组合。有人可以用一种通用的方式来帮助我实现它。LINQ动态查询查询 - 多个字段

+0

可能重复(http://stackoverflow.com/questions/298725/multiple-order-by-in-linq) –

+1

http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet – JohnLBevan

+0

LINQ使用ThenBy函数提供了这种开箱即用的功能,不需要使用动态Linq或任何东西 –

回答

0

我也在这里找到他可能喜欢的东西:http://www.codeproject.com/Articles/27834/Generic-List-Sort-Function < - 希望它有帮助,它可以根据任何输入属性进行排序。该物业是通过反思。

+0

该方法在List中实现,而不是在IQueryable中实现。所以只能在.ToList()之后使用,换句话说,在数据加载之后才能使用。 –

1

LINQ已经允许您通过排序依据后加入Queryable.ThenByQueryableThenByDescendingEnumerable.ThenByEnumerable.ThenByDescending功能使用多个字段进行排序。

检查Multiple “order by” in LINQ对于类似的问题和讨论。如果您需要Enumerable未提供的罕见方法,则可以将Enumerable转换为Queryable,只需在其上调用AsQueryable即可。

+0

我知道LinQ有orderby和thenby函数。但是这里的问题是因为场的顺序是动态的,我如何通过场并相应地安排它们? – user1687824

+0

您不需要*传递*任何东西,只需使用适当的lambda调用ThenBy,具体取决于您要订购的字段。即使是一个简单的switch语句也可以。或者,您可以使用要订购的lambda表创建数组/列表,然后逐个应用它们。拉姆达只不过是另一种类型的变量 –

+0

我不确定你是否理解了我,或者我没有明白它......你可以给我一些示例代码吗?根据你的解决方案,我需要给予orderby。其余的呢?那么如何动态地实现呢? – user1687824

1

下面是一个例子

// Just to get IOrderedEnumerable from the collection 
// And set the default order 
var orderedItems = context.Items.OrderBy(i => i.Name); 

var orderByString = txtOrderBy.Text.ToLower(); 
switch(orderByString) 
{ 
    case "category": 
     orderedItems = orderedItems.OrderBy(i => i.Category); 
     break; 
    case "date": 
     orderedItems = orderedItems.OrderBy(i => i.Date); 
     break; 
    default: 
     break; 
} 
[在LINQ多个 “以便通过”]的
+0

这不是按一组字段排序,而是按最后一个OrderBy字段计数。 –