首页 新闻 会员 周边

如何对集合或DataTable按特定规则进行排序

0
悬赏园豆:50 [已解决问题] 解决于 2012-10-10 12:00

对child表进行查询,返回一个集合,该集合要按照:班级’升序,再按照特定排序规则:评价结论:优秀->良好->合格->不合格。进行排序。

因为我是出报表,要将集合转化为DataTable后绑定数据源,所以有两种选择,1,先对集合排序,2,转化为DataTable后,对DatatTable进行排序。哪种都行,实现了就好。

< >
分享
最佳答案
0

先试下:

xxDataTable.Sort="班级,评价结论 desc"

如果“评价结论”无法正确排序就只能再搞一列存评价结论对应的数值,然后用数值排序,再删除这列。

收获园豆:50
向往-SONG | 老鸟四级 |园豆:4853 | 2012-10-10 09:15

如果用这种方式,刚好能排出“优秀->良好->合格->不合格”顺序,可是不严谨啊,我也没去深究如何得到的,似乎是汉语拼音首字母? “Y >L>H>B”,如果以后结果值改成别的文字,这种排序就还得改。

我采用的你所说的实体类增加扩展属性,来便于排序的方法,虽然要至少改动两个类,但至少算是种简单而且高效的方法了。

银川程序员java&.net | 园豆:164 (初学一级) | 2012-10-10 11:52
其他回答(4)
0

DataTable中增加一个字段,比如:No

优秀的No取0,良好的No取1,依次类推

然后用DataTable.Select("", "No")排序

田林九村 | 园豆:2367 (老鸟四级) | 2012-10-10 09:07

多谢回答,权衡后采用了实体类增加扩展属性的方法来便于排序。

支持(0) 反对(0) 银川程序员java&.net | 园豆:164 (初学一级) | 2012-10-10 11:47

@银川程序员.Net: 嗯,不客气

支持(0) 反对(0) 田林九村 | 园豆:2367 (老鸟四级) | 2012-10-10 11:48
0

list.orderby(l=>l.班级).OrderByDescending(l=>l.评论结论)

chenping2008 | 园豆:9836 (大侠五级) | 2012-10-10 09:09

"OrderByDescending(l=>l.评论结论)",如何判断得出“优秀->良好->合格->不合格”?

支持(0) 反对(0) 银川程序员java&.net | 园豆:164 (初学一级) | 2012-10-10 09:13

@银川程序员.Net: 你存放的是文字 优秀,良好 在数据库????

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-10-10 09:18

@chenping2008: 对啊,考虑到了要改数据库表,存入int型的,读取和存放时转换为string型的,可类似的表好几张,而且需要手动修改“转换”的地方很多,不现实啊。

支持(0) 反对(0) 银川程序员java&.net | 园豆:164 (初学一级) | 2012-10-10 09:20

@银川程序员.Net: 如果是int这个还好排序一点,如果是string,那就要麻烦您了

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-10-10 09:30

@chenping2008: 还是多谢啦,看来我不得不试试用DataTable里加一列的方式了

支持(0) 反对(0) 银川程序员java&.net | 园豆:164 (初学一级) | 2012-10-10 09:37

@银川程序员.Net: 

在实体上再加个属性:

public int PinglunValue
{
get {
switch (Pinglun)
{
case "优秀": return 1;
case "良好": return 2;
case "合格": return 3;
case "不合格": return 4;
}
return 1;
}
}

 

再用orderby呢:.OrderBy(a => a.Cls).OrderBy(a => a.PinglunValue)

支持(1) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-10-10 10:01

@向往-SONG: 完全可以

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-10-10 10:02

@向往-SONG:“ LINQ to Entities 不支持指定的类型成员“评价结论int”。只支持初始值设定项、实体成员和实体导航属性。”,我在实体类中添加了   

        public int 评价结论int
        {
            get
            {
                switch (评价结论)
                {
                    case "优秀":return 1;
                    case "良好":return 2;
                    case "合格": return 3;
                    case "不合格":return 4;
                    default:return 0;
                }
            }
        },但是会弹BUG,看来Linq to Entity不支持这种方式

支持(0) 反对(0) 银川程序员java&.net | 园豆:164 (初学一级) | 2012-10-10 11:33
0

order by charindex(字段名,’条件1,条件2,条件3‘)就可以了

暗尘掩月 | 园豆:183 (初学一级) | 2012-10-10 09:24

我这用的是Linq查询,涉及表间关系(便于理解我例举的事一张表,其实是多张表间的查询),改写成SQL语句,对于我有点困难.

支持(0) 反对(0) 银川程序员java&.net | 园豆:164 (初学一级) | 2012-10-10 09:31

@银川程序员.Net: http://fqctyj.blog.163.com/blog/static/7084345520114128382600/ 

Linq to SQL: 自定义排序 - Q.yuhen 其实这层已经给出了答案,楼主只要用order by charindex加Linq搜索下就能得到自己想要的答案.

支持(0) 反对(0) 天天不在 | 园豆:926 (小虾三级) | 2012-10-10 09:45

@银川程序员.Net: LINQ 也有charindex 方法var ulist=db.User.Where(u=>list.Contains(u.id)).OrderBy(o=>SqlFunctions.CharIndex("1,2,3,4,5",o.id));

支持(0) 反对(0) 暗尘掩月 | 园豆:183 (初学一级) | 2012-10-10 09:55

@暗尘掩月: 试验了下,在SqlFunctions.CharIndex("1,2,3,4,5",o.id)里,CharIndex的参数不支持类似"优秀", "良好", "合格", "不合格"的string数组

支持(0) 反对(0) 银川程序员java&.net | 园豆:164 (初学一级) | 2012-10-10 10:44

理想中的解决方案,可惜对这个研究了一早上没成功,我采用了实体类增加便于排序的扩展属性的方式。谢谢了

支持(0) 反对(0) 银川程序员java&.net | 园豆:164 (初学一级) | 2012-10-10 11:53
0

关注,学习~

Philomena | 园豆:154 (初学一级) | 2012-10-10 10:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册