C# 使用linq按字母顺序分组计算电影
我要做的是计算所有以字母和数字开头的电影,如数字=20、a=10、B=12、…z=18等。到目前为止,我尝试了两个查询以获得我想要的结果: 第一: 但它只按第一个字母分组。因此,我制作了另一个存储字母表的表,并编写了以下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
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);
选择取决于您和数据库容量/性能要求
参考:
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);