2012-04-08 72 views
2

我有一个如下所示的查询:它将一个ID列表(ThelistOfIDs)作为参数,我正在对一个计数进行分组。linq-to-sql获取序列包含多个元素

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中进行计数;我想在数据库中进行计数并将结果返回。

+2

你会得到什么错误? – Krizz 2012-04-08 14:32:54

+0

@Krizz:“序列包含多个元素” – frenchie 2012-04-08 14:33:12

+0

您期望有多少个组?查询*看起来*返回每个状态的一个元素 – 2012-04-08 14:36:32

回答

2

我没有把你的查询到我的IDE或用C#编写的,但我想这个问题是 groups在您的查询IGrouping<Tkey, Telm>而不是IQueryable<Tkey> (其中Tkeyl.StatusTelm类型是l型) 。

我觉得你对使用分组操作符感到困惑。

你想获得什么是我想:

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查询只有一次。

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 } }。其他行只是将结果 - 即项目集合 - 转换为具有特定对象作为属性的单个对象,并且在物理上完成这两个值。

+0

好吧,有没有办法把这个在一个声明? – frenchie 2012-04-08 14:46:14

+0

@frenchie - 你为什么要这样? – Krizz 2012-04-08 14:46:58

+0

因为我想在数据库中进行计数并只返回计数,而不是整个集合。 – frenchie 2012-04-08 15:28:43

1

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

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

+0

的计数,所有ID都有2个状态,状态== 1或状态== 2 – frenchie 2012-04-08 14:39:57

+0

@frenchie是,但是您的出发点仍然是分组 - 所以2行。对于每个人,然后对“组”数据执行一些计算。 – 2012-04-08 14:42:10

+0

那么我需要改变什么? – frenchie 2012-04-08 14:45:53

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<>或记录。

希望这可以帮助

相关问题