2

我有一个看起来像这样的查询:它需要一个 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 中进行计数;我想在数据库中进行计数并带回结果。

4

3 回答 3

2

我没有将您的查询放入我的 IDE 或使用 C# 编译,但我想问题是 groups在您的查询中是而IGrouping<Tkey, Telm>不是IQueryable<Tkey> (类型在哪里,Tkey类型在哪里)。l.StatusTelml

我认为您对使用分组运算符感到困惑。

你想得到的是我猜:

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(),
              };

编辑

替代查询,为了获得相同的结果,将对 DB 的所有操作移到原始查询中,以便仅查询一次 DB。

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.

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

于 2012-04-08T14:41:49.310 回答
1

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

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

于 2012-04-08T14:38:50.577 回答
0

这可能是你想要得到的......
(它适用于我拥有的用户表,但应该是相同的)

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<>您的记录。

希望这可以帮助

于 2012-04-08T15:49:41.987 回答