使用LINQ按字母顺序分组计算电影数

3
我的任务是计算所有以字母和数字开头的电影,其中数字=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,但是计数不正确。请帮我找到解决方案,使以数字开头的电影都归为一个类别,以字母开头的电影按字母顺序分组。谢谢!

你能给出一个你想要实现的标题和分组的例子吗?比如,“27件礼服”应该属于哪个分组? “27”组吗? - Cyril Gandon
27 Dresses 应该在名为“number”的组中。而 American Gangster 应该在“A”中。 - Yogendra Paudyal
1个回答

1
当您对结果进行分组时,可以测试第一个字符是否为数字。如果是,则按特殊名称(如“Number”)进行分组,否则按第一个字符进行分组:
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);

选择权在你手中,取决于你的数据库大小和性能要求。
参考资料:

IsDigit对于lambda表达式不起作用。它说无法更改为存储表达式。 - Yogendra Paudyal
True,Char.IsDigit不能在Linq to Sql查询中使用。请参见我的编辑答案。 - Cyril Gandon
谢谢Scorpi0,经典方法对我很有效,因为我正在使用linq to entity。我可能有大约100万部电影信息。这会导致一些性能问题吗? - Yogendra Paudyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接