通过使用linq按字母顺序分组来计算电影

时间:2013-04-30 09:57:53

标签: c# linq

我要做的就是将所有以字母和数字开头的电影计为数字= 20,A = 10,B = 12,...... z = 18等我到目前为止已尝试过两次查询以实现我想要的结果:

第一:

var companyquery = (from movieInfo in db.MovieInformations
                     group movieInfo by movieInfo.MovieTitle.Substring(0, 1)
                            into movieInfogroup
                            select new MovieNumberModel
                            {
                                Character = movieInfogroup.Key,
                                Number = movieInfogroup.Count() 
                            }).OrderBy(mapping => mapping.Character);

但它只按第一个字母分组。所以,我创建了另一个存储字母表的表,并编写了以下linq查询:

var companyquery1 = (from movieInfo in db.MovieInformations
                     from Category in db.CharCategory
                         group movieInfo.MovieTitle by Category.Character
                         into movieInfogroup
                         select new MovieNumberModel
                         {
                             Character = movieInfogroup.Key,
                             Number = movieInfogroup.Count() 
                         }).OrderBy(mapping => mapping.Character)

这个linq查询确实给出了所有字母表,如A到z,但没有正确计数。请帮我找到解决方案,以便所有以数字开头的电影都属于一个类别,而以字母开头的电影则根据字母表进行分组。谢谢!

1 个答案:

答案 0 :(得分:1)

对结果进行分组时,可以测试第一个字符是否为数字。如果是,则按“数字”之类的特殊名称分组,否则按第一个字符分组:

var companyquery1 = db.MovieInformations
   .Select(movieInfo => movieInfo.MovieTitle.FirstOrDefault().ToString())
   .GroupBy(firstChar => SqlMethods.Like(firstChar, "[0-9]%") ? "Number" : firstChar)
   .Select(grp => new { Character = grp.Key, Number = grp.Count() })
   .OrderBy(anon => anon.Character);

您必须使用SqlMethods.Like功能,因为您正在查询数据库。

您还可以加载内存中的所有信息,以便能够使用经典方法:

var movieInformations = db.MovieInformations.ToList();
var companyquery1 = movieInformations 
   .Select(movieInfo => movieInfo.MovieTitle.FirstOrDefault().ToString())
   .GroupBy(firstChar => Char.IsDigit(firstChar) ? "Number" : firstChar)
   .Select(grp => new { Character = grp.Key, Number = grp.Count() })
   .OrderBy(anon => anon.Character);

选择权取决于您和数据库/性能要求的大小。

参考: