3

我要做的是将所有以字母和数字开头的电影计数为 number=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,但计数不正确。请帮助我找到解决方案,以便所有以数字开头的电影都归入一个类别,而以字母开头的电影则根据字母表进行分组。谢谢!

4

1 回答 1

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);

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

参考 :

于 2013-04-30T10:06:05.643 回答