C# 使用linq按字母顺序分组计算电影

C# 使用linq按字母顺序分组计算电影,c#,linq,C#,Linq,我要做的是计算所有以字母和数字开头的电影,如数字=20、a=10、B=12、…z=18等。到目前为止,我尝试了两个查询以获得我想要的结果: 第一: 但它只按第一个字母分组。因此,我制作了另一个存储字母表的表,并编写了以下linq查询: var companyquery1 = (from movieInfo in db.MovieInformations from Category in db.CharCategory

我要做的是计算所有以字母和数字开头的电影,如数字=20、a=10、B=12、…z=18等。到目前为止,我尝试了两个查询以获得我想要的结果:

第一:

但它只按第一个字母分组。因此,我制作了另一个存储字母表的表,并编写了以下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,但不能正确计数。请帮助我找到解决方案,以便所有以数字开头的电影都归入一个类别,而以字母开头的电影则按照字母表进行分组。谢谢大家!

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

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);
选择取决于您和数据库容量/性能要求

参考:


你能举一个你想获得的头衔和组别的例子吗?比如“27件连衣裙”必须在哪一组?“27”组?27件连衣裙应在标题为“编号”的组中。美国黑帮应该在“A”中。IsDigit不是为lambda expression工作的。它表示无法将其更改为存储表达式。确实,Char.IsDigit不能用于Linq to Sql查询。请参阅我编辑的答案。谢谢Scorpi0,经典方法对我来说很好,因为我正在使用linq创建实体。我可能有大约一百万部电影的信息。它是否会带来一些性能问题?
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);