c# - 通过使用 linq 按字母顺序分组来计算电影

标签 c# linq

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

最佳答案

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

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

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

引用:

关于c# - 通过使用 linq 按字母顺序分组来计算电影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16297099/

相关文章:

c# - 如何使用 C# 在 MongoDB 中的嵌套子数组文档中查找元素

c# - Linq 查询不返回任何内容

c# - 如何以特定格式绑定(bind)日期时间列中的网格

c# - 如何从触发器获取接触点?

c# - 如何读取由 XmlDiff.Compare() 生成的 diffgram 文件

c# - 将 XML 文件读入 XmlDocument

vb.net - LINQ分组依据问题

c# - 用 Linq 拼接 IEnumerable

Linq-按StartsWith排序,然后包含

当 C++ 使用智能指针时,C# 委托(delegate)等效