我要做的就是将所有以字母和数字开头的电影计为数字= 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,但没有正确计数。请帮我找到解决方案,以便所有以数字开头的电影都属于一个类别,而以字母开头的电影则根据字母表进行分组。谢谢!
答案 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);
选择权取决于您和数据库/性能要求的大小。
参考: