LinQ-to-SQL 获取序列包含多个元素

本文关键字:元素 包含多 获取 LinQ-to-SQL | 更新日期: 2023-09-27 18:30:28

>我有一个看起来像这样的查询:它接受一个ID(ThelistOfIDs)列表作为参数,我正在分组计数。

var TheCounter = (from l in MyDC.SomeTable
                  where ThelistOfIDs.Contains(l.ID)
                  group l by l.Status into groups
                  select new Counter()
                  {
                      CountOnes = (from g in groups
                                   where g.Status == 1
                                   select g).Count(),
                      CountTwos = (from g in groups
                                   where g.Status == 2
                                   select g).Count(),
                  }).Single();

基本上,我不明白为什么我会收到错误。我不想从数据库中带回 entore 集合并在 linq-to-object 中进行计数;我想在数据库中进行计数并带回结果。

LinQ-to-SQL 获取序列包含多个元素

我没有

将您的查询放入我的 IDE 或使用 C# 编译,但我想问题是 查询中的groupsIGrouping<Tkey, Telm>而不是IQueryable<Tkey> (其中Tkeyl.Status类型,Telml类型)。

我想您对分组运算符的使用感到困惑。

我想你想得到的是:

var queryByStatus = from l in MyDC.SomeTable
                    where ThelistOfIDs.Contains(l.ID)
                    group l by l.Status;
var counter = new Counter() 
              {
                  CountOnes = queryByStatus.Where(l => l.Key == 1).Count(),
                  CountTwos = queryByStatus.Where(l => l.Key == 2).Count(),
              };

编辑

替代查询,

为了获得相同的结果,将数据库上的所有操作移动到原始查询中,以便仅查询一次数据库。

var queryCountByStatus = from l in MyDC.SomeTable
                    where ThelistOfIDs.Contains(l.ID)
                    group l by l.Status into r
                    select new { status = r.Key, count = r.Count() };
 var countByStatus = queryCountByStatus.ToList();
 var counter = new Counter() 
               {
                    CountOnes = countByStatus.FirstOrDefault(l => l.status == 1).count,
                    CountTwos = countByStatus.FirstOrDefault(l => l.status == 2).count,
               };

注意:

我的编辑部分中的查询仅查询数据库一次,并返回映射Status -> Count

请注意,在我的原始查询中,只需要两次对 DB 的调用 - 两者都返回一个数字 - 一个用于CountOnes,一个用于CountTwos

编辑查询中,执行一个查询,该查询返回表{ { 1, CountOnes}, {2, CountTwos } } 。其他行只是将结果(一组项目)转换为具有某些对象作为属性的单个对象,并在这两个值上物理完成。

您按状态分组,然后从该组投影 - 但每个唯一状态(===组)仍将有一行。

所以:我建议你没有一个独特的状态。

这可能是您正在寻找的...
(这是我的用户表,但应该是一样的)

var statuscounts = (from u in db.Users
                    where u.UserStatus > 0
                    group u by u.UserStatus into groups
                    select new { Status = groups.Key, Count = groups.Count() });
// do this to iterate and pump into a Counter at will
foreach (var g in statuscounts)
    Console.WriteLine("{0}, {1}", g.Status, g.Count);

。甚至类似的东西...

var counter = statuscounts.AsEnumerable()
                    .Aggregate(new Counter(), (c, a) => {
                            switch (a.Status)
                            {
                                case 1: c.CountOfOnes = a.Count; return c;
                                case 2: c.CountOfTwos = a.Count; return c;
                                case 3: c.CountOfThrees = a.Count; return c;
                                default: c.CountOfOthers = a.Count; return c;
                            }});

。要点是,如果您已经分组,则应使用分组结果,它属于 IGrouping<out TKey, out TElement> 类型,其中键是您的状态,它是IEnumerable<>或您的记录。

希望这有帮助