首页 新闻 会员 周边 捐助

sql 或者 EF 排序问题?

0
悬赏园豆:20 [已解决问题] 解决于 2014-01-22 10:35

比如有一句话:白日依山尽。

从数据库查出来后5条记录,但顺序乱了,比如:

[zi]  [yin]

尽  jin

日  ri

依  yi

白  bai

山 shan

除了逐字处理的方式,有没有可能通过Linq或一句SQL让它按照某一句话中字的顺序排序的功能?

问题补充:

数据库中表只有汉字和拼音两个字段,查询条件是一串汉字,即一句话,希望查出来的结果也按传入的这句话排序。因为这一句话可能很长,超过5000字

空明流光的主页 空明流光 | 初学一级 | 园豆:111
提问于:2014-01-17 20:49
< >
分享
最佳答案
0

需求不够明确,你的数据库里面是啥记录?或者是我的理解力有问题?

收获园豆:10
爱编程的大叔 | 高人七级 |园豆:30844 | 2014-01-17 21:06

汉字和拼音两个字段,查询条件是一串汉字

空明流光 | 园豆:111 (初学一级) | 2014-01-17 21:20

@沧海一杰: 

看了你另外一贴,大概知道你想干啥了。

这个方法我暂时不知道。

不过我不建议你用这个方法实现你的解决方案,我的意思是你的解决方案是有问题的。

解决了这问题也没有用。

说几点理由吧。

1、汉字拼音,不需要用查字典的方式,微软有个库可以支持传入一个汉字,返回这个汉字所有拼音。

2、你用这个方法是用Where 5000个字.contains(汉字字段)  这样查询是吗?这个效率也不会高的。

而且SQL查询字符串是有长度限制的。

3、你要用空间来换时间的话,就要把这5000个字先处理一下,放在数据库里面,每个字都有一个顺序号,还有一个选择好的拼音(多音字,在UI上显示多个,管理员选择其中一个后,保存在数据库里面)

就是说,字段是三个, 一个是汉字,一个是拼音,一个是顺序号。这样你查询的时候,就可以按照顺序号排序了。

或者就是选好的所有拼音连在一起放一个字段之类的。(看你其他的需求决定)

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-01-17 22:54

@爱编程的大叔: 1.这个是一定要查数据库的,因为微软提供的拼音库获取不到声调。而且我这里有很多字是并不是取自常用的新华字典,而是直接注意康熙字典里的这字,这些字一般的字典都查不到,我不认为可以通过微软的库获取到正确的读音。即使以上的问题都能通过微软的库解决,但考虑到有些情况要自定义,让拼音是可控的,所以暂时不考虑使用微软的库。2.时间换空间,我不认为你的方法能提高效率。至于5000个不能一次性传入数据库,但我可以分一百次查询不就可以了吗?每个汉字都是查询关键字呀,当然重复的不算,这个字一定是要传入数据库的。现在数据库中汉字列就是主键。

空明流光 | 园豆:111 (初学一级) | 2014-01-20 14:10

@沧海一杰: 

1、微软的拼音库是可以获取到声调的,不知道谁告诉你获取不到。当然,如果你要用自己的字典,也不反对。你这问的是两个问题,我认为重点是第二个问题,至于怎么查一个汉字的拼音,相对于第二个问题来说,确实不重要。

2、不知道你要做啥,你觉得行就行好了。这个问题是解决方案的重点,你需求还是没有明确,我只是觉得你可能走错的方向,不过每个人面对的问题不同,掌握的知识面不同,所以有可能你的方案是对的也说不定。

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-01-20 20:52

@爱编程的大叔: 如果可以获取声调,我再试试,我拿到的代码居然获取不到,它用1,2,3,4,5来表示声调。这种就太烂,我要可以直接和拼音一起显示的。我也希望微软的这个库可以把我拼音问题解决了,因为我的文章可能还牵扯到自动断词断句和通过词典进行中文注释,所以查词典是难免的,词典里的拼音我是可以自己维护的。

空明流光 | 园豆:111 (初学一级) | 2014-01-22 10:27

@沧海一杰: 

建议你看看最新有一篇文章,讲界面与数据分离的。

你好象一直把界面与数据两个概念合并了。

首先,拼音取得是数据,至于你要怎么显示,那是UI。

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-01-22 12:26

@爱编程的大叔: 因为拼音对我来说是不可控的,我总不能再去研究声调是怎么注上去的。拼音应该是单一的,只由一个元素组成,如果一个字“白”得到的拼音是"bai","2",这里的2代表声调二声,我还要判断音调是要注到哪个字母上面,判断出来后,那么如何把2注到bai中的a上面呢?这些问题会应运而生。应该是能直接获取到的就是:bái,我就不用处理上述问题了。

空明流光 | 园豆:111 (初学一级) | 2014-01-22 14:42

@沧海一杰:

拼音标注的方法 http://iask.sina.com.cn/b/20864901.html

你把好多问题全部搅在一起了,按照你这样的话,变成你要存储

白  <----> bái

你可能就是希望在UI上可以直接显示bái,但为了UI,你牺牲了数据的灵活性了。(可能这么说不一定对)

但是感觉上,你真的是把数据和UI混在一起了。

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-01-22 17:57

@爱编程的大叔: 或许吧,最主要的是功能,分层与我如浮云,不关心。

空明流光 | 园豆:111 (初学一级) | 2014-01-23 10:36
其他回答(4)
0
string s = "白日依山尽";
            var ar = new[] { "", "", "", "", "" };
            //利用字典处理好传入的顺序
            var dic = new Dictionary<string, int>();
            for (var i = 0; i < s.Length; i++)
            {
                var ch = s[i].ToString(CultureInfo.InvariantCulture);
                if (!dic.ContainsKey(ch))
                {
                    dic.Add(ch, i);
                }
            }
            //利用自定义排序规则排序
            Array.Sort(ar, (a, b) => dic[a] - dic[b]);

以上是一段模拟代码,没有处理重复的汉字。

最后一句还可以换换,如下:

Array.Sort(ar, (a, b) => s.IndexOf(a, StringComparison.Ordinal) - s.IndexOf(b, StringComparison.Ordinal));

收获园豆:10
幻天芒 | 园豆:37205 (高人七级) | 2014-01-17 23:22
0

跟一楼说的一样`.你要把一个5000个汉字长度的数据也就是1mb的数据穿到数据库去做查询条件`.你当SQL是神啊``

这样搞你这系统不用运行了``别走这个思路了.换个别的方案吧`

吴瑞祥 | 园豆:29449 (高人七级) | 2014-01-18 08:38
0

顶一楼

bitbug | 园豆:470 (菜鸟二级) | 2014-01-20 08:54
0

学习了!

大楚打码人 | 园豆:4313 (老鸟四级) | 2014-01-20 10:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册