首页 新闻 赞助 找找看

linq的一个排序写法

0
[已解决问题] 解决于 2017-02-16 11:02

有这样一批数据:

List<MyClass> list = new List<MyClass>()
{
new MyClass() {id = 0, name = "待制定", value1 = 1, value2 = 1},
new MyClass() {id = 0, name = "待制定", value1 = 2, value2 = 2},
new MyClass() {id = 0, name = "待制定", value1 = 3, value2 = 3},
new MyClass() {id = 1, name = "已制定", value1 = 2, value2 = 1},
new MyClass() {id = 1, name = "已制定", value1 = 3, value2 = 2},
new MyClass() {id = 1, name = "已制定", value1 = 4, value2 =3}
};

 

在这个例子中,id就只有0跟1两种情况,首先要按照id进行排序,然后当id=0的时候,对value1排序,当id=1的时候对value2进行一个降序排序。

 

用linq能实现这个排序吗?

 

PowerDK的主页 PowerDK | 菜鸟二级 | 园豆:208
提问于:2017-02-15 09:57
< >
分享
最佳答案
1

list.orderby(a=>a.id).thenbydesc(a=>a.id==0?a.value1:a.vlaue2)

单次懒得去查.知道是什么意思就行

奖励园豆:5
吴瑞祥 | 高人七级 |园豆:29449 | 2017-02-15 10:03

value1是正常排序,value2是降序排序的

PowerDK | 园豆:208 (菜鸟二级) | 2017-02-15 10:04

@PowerDK: 那就.thenbydesc(a=>a.id==0?a.value1*-1:a.vlaue2)

吴瑞祥 | 园豆:29449 (高人七级) | 2017-02-15 10:10

@PowerDK: 总的来说这个和linq没关系.是思路问题.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-02-15 10:10

@吴瑞祥: 十分感谢您提供了这个思路!

但貌似在实际解决中,这value1跟value2都是日期格式的,数据库又是mysql,貌似也对日期做不了计算

PowerDK | 园豆:208 (菜鸟二级) | 2017-02-15 14:03

@PowerDK: 是的.这种需求是肯定会全表扫描的.换种解决方案吧.比如分成几段.然后一段一段查.再拼接起来.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-02-15 14:27

@吴瑞祥: 数据量不会太大,所以也不怎么考虑性能!这个linq也对日期转化不了,这样只能保持都是升序或者是降序,假如一升一降就处理不了了。看来只能找其他方法了

PowerDK | 园豆:208 (菜鸟二级) | 2017-02-15 14:33

@PowerDK: 谁说的.被你说的都有点气了.

要是数据不大.你直接读到内存里处理.至于你说的日期转化不了.

那你就把日期转成整数不久好了.

.thenbydesc(a=>a.id==0?(a.value1 - DateTime.Now).TotalSeconds*-1:(a.vlaue2-DateTime.now).TotalSeconds)
吴瑞祥 | 园豆:29449 (高人七级) | 2017-02-15 17:58

@吴瑞祥: 这实际还是有点麻烦的!我用的数据库是mysql,上面的语句翻译成sql的时候,执行.TotalSeconds是会报错的~所以在计算这个日期的时候会报错~

因为测试是直接用list的,所以支持计算日期

PowerDK | 园豆:208 (菜鸟二级) | 2017-02-16 09:51

@PowerDK: 要是数据不大.你直接读到内存里处理.你自己都说数据量不大了.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-02-16 10:30

@吴瑞祥: 就假设不能读到内存,好像真写不出来了

PowerDK | 园豆:208 (菜鸟二级) | 2017-02-16 10:32

@PowerDK: 那就加个字段.把所有日子用数据库函数转成整型.再以那个字段排序.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-02-16 10:33

@吴瑞祥: 后面还是写sql,执行sql了,还是感谢你提供了思路

PowerDK | 园豆:208 (菜鸟二级) | 2017-02-16 11:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册