我在动态LINQ的VS2008 Examples中找到了一个示例,它允许您使用类似sql的字符串(例如 OrderBy("Name, Age DESC"))
用于排序 . 不幸的是,包含的方法仅适用于 IQueryable<T>
; . 有什么方法可以在 IEnumerable<T>
上获得此功能?
我在动态LINQ的VS2008 Examples中找到了一个示例,它允许您使用类似sql的字符串(例如 OrderBy("Name, Age DESC"))
用于排序 . 不幸的是,包含的方法仅适用于 IQueryable<T>
; . 有什么方法可以在 IEnumerable<T>
上获得此功能?
18 回答
这是我觉得有趣的其他东西 . 如果您的源是DataTable,则可以在不使用Dynamic Linq的情况下使用动态排序
参考:http://msdn.microsoft.com/en-us/library/bb669083.aspx(使用DataSetExtensions)
通过将其转换为DataView,还有另一种方法:
我绊倒了这个问题,寻找Linq多个orderby子句,也许这就是作者所寻求的
以下是如何做到这一点:
偶然发现了这个问题 .
使用上面的Marc的ApplyOrder实现,我把一个处理类似SQL的字符串的Extension方法拼凑在一起,如:
详情请见:http://aonnull.blogspot.com/2010/08/dynamic-sql-like-linq-orderby-extension.html
首先安装动态 Tools --> NuGet Package Manager --> Package Manager Console
添加 Namespace
using System.Linq.Dynamic;
现在你可以使用
OrderBy("Name, Age DESC")
感谢Maarten(Query a collection using PropertyInfo object in LINQ)我得到了这个解决方案:
在我的情况下,我正在开发一个“ColumnHeaderMouseClick”(WindowsForm),所以只是发现按下的特定列及其对应的PropertyInfo:
要么
(确保您的列名称与对象属性匹配)
干杯
我想使用反射来获取你想要排序的任何属性是有用的:
请注意,使用反射比直接访问属性要慢得多,因此必须调查性能 .
你可以添加它:
GetPropertyValue
函数来自Kjetil Watnedal's answer问题是为什么?任何这样的排序都会在运行时抛出异常,而不是编译时间(如D2VIANT的答案) .
如果您正在处理Linq到Sql并且orderby是一个表达式树,它将被转换为SQL以供执行 .
我试图这样做但是因为我没有使用内联linq语法而遇到Kjetil Watnedal's solution问题 - 我更喜欢方法式语法 . 我的具体问题是尝试使用自定义
IComparer
进行动态排序 .我的解决方案最终如下:
给出一个IQueryable查询,如下所示:
并给出了运行时排序字段参数:
动态OrderBy看起来像这样:
这是使用一个名为GetReflectedPropertyValue()的辅助方法:
最后一件事 - 我提到我希望
OrderBy
使用自定义IComparer
- 因为我想做Natural sorting .要做到这一点,我只需将
OrderBy
改为:有关
NaturalSortComparer()
的代码,请参阅this post .这个答案是对需要@John Sheehan - Runscope提供的解决方案示例的评论的回应
在DAL(数据访问层)中,
The IEnumerable version:
The IQueryable version
现在您可以使用IQueryable版本进行绑定,例如Asp.net中的GridView并有利于排序(您无法使用IEnumerable版本进行排序)
我使用Dapper作为ORM并构建IQueryable版本并在asp.net中使用GridView中的排序非常简单 .
经过大量的搜索,这对我有用:
您可以将IEnumerable转换为IQueryable .
将List转换为IEnumerable或Iquerable,使用System.LINQ.Dynamic命名空间添加,然后你可以用逗号分隔的字符串中的属性名称提到OrderBy方法,该方法默认来自System.LINQ.Dynamic .
备用解决方案使用以下类/接口 . 它不是真正的动态,但它的工作原理 .
没有任何复杂情况太容易了:
在顶部添加
using System.Linq.Dynamic;
.使用
vehicles = vehicles.AsQueryable().OrderBy("Make ASC, Year DESC").ToList();
只是 Build 在别人所说的基础之上 . 我发现以下效果很好 .
我找到了答案 . 我可以使用
.AsQueryable<>()
扩展方法将我的列表转换为IQueryable,然后通过它来运行动态订单 .只是偶然发现这个老人......
要在没有动态LINQ库的情况下执行此操作,您只需要以下代码即可 . 这涵盖了大多数常见方案,包括嵌套属性 .
要使用
IEnumerable<T>
,您可以添加一些通过AsQueryable
的包装器方法 - 但下面的代码是所需的核心Expression
逻辑 .编辑:如果你想将它与
dynamic
混合,它会变得更有趣 - 尽管注意dynamic
仅适用于LINQ到对象(ORM等的表达式树不能真正代表dynamic
查询 -MemberExpression
不是't support it). But here'这样做的方法使用LINQ-to-Objects . 注意Hashtable
的选择是由于有利的锁定语义: