在单个表中获取同一列的两个项目的计数

时间:2012-10-22 07:52:56

标签: c# linq-to-entities

我正在开发一个拥有桌面和移动客户的网站。为了分析,我想知道用户是通过桌面还是移动设备访问我的网站,因为我在数据库中有一个表,其中有几列用于存储用户的设备详细信息。因为我有一个名为IsMobile的列,因为我根据用户的设备存储true / false。现在我想使用linq查询得到真假的计数。

我正在使用以下代码。

 public IList<IsMobile> IsMobile(DateTime fromDate, DateTime toDate)
    {
        var isMobile = (from d in _db.UserDeviceDetail
                        where ((d.CreatedOn.Month >= fromDate.Month && d.CreatedOn.Day >= fromDate.Day && d.CreatedOn.Year >= fromDate.Year) || (d.CreatedOn.Month <= toDate.Month && d.CreatedOn.Day <= toDate.Day && d.CreatedOn.Year <= toDate.Year))
                        group d by d.IsMobile into g 
                        select new IsMobile
                        {
                            Yes = g.Count(n => n.IsMobile == true),
                            No = g.Count(n => n.IsMobile == false)
                        }).ToList();

        return isMobile;
    }

我正在获得正确的计数详情,但有两个列表项目1用于计算是和另一个用于计算否,而是我想获得单个列表项目,通过一次计算是和否

原样:      {是20;没有0}      {是0;没有10}

应该如何:      {是20;没有10}

我是linq查询的新手,请告诉我我做错了什么?

2 个答案:

答案 0 :(得分:2)

分组是LINQ创建两个项目而不是一个项目的原因。 它将整个项目集分成一定数量的子集,每个子​​集分别处理。

没有分组的查询应该可以解决问题。

UPD :以下查询应返回包含一个IsMobile项目的列表。如果只返回一个项而不是列表,则可以简化:

var isMobile = (from d in _db.UserDeviceDetail 
                        where ((d.CreatedOn.Month >= fromDate.Month && d.CreatedOn.Day >= fromDate.Day && d.CreatedOn.Year >= fromDate.Year) || (d.CreatedOn.Month <= toDate.Month && d.CreatedOn.Day <= toDate.Day && d.CreatedOn.Year <= toDate.Year)) 
                        select d).ToList(); 
return new List<IsMobile>(){
            new IsMobile{ 
                Yes = isMobile.Count(n => n.IsMobile == true), 
                No = isMobile.Count(n => n.IsMobile == false)}
            };

答案 1 :(得分:1)

如果您只想知道有多少项IList<IsMobile>以及有多少项IsMobile == true,您为什么要选择IsMobile == false

我会返回Tuple<int, int>代替:

public Tuple<int, int> mobileCounts(DateTime fromDate, DateTime toDate)
{
    var inTime = _db.UserDeviceDetail.Where(d=> (d.CreatedOn.Month >= fromDate.Month && d.CreatedOn.Day >= fromDate.Day && d.CreatedOn.Year >= fromDate.Year) || (d.CreatedOn.Month <= toDate.Month && d.CreatedOn.Day <= toDate.Day && d.CreatedOn.Year <= toDate.Year));
    int isMobileCount = inTime.Count(d => d.IsMobile);
    int isNotMobileCount = inTime.Count(d => !d.IsMobile);
    return Tuple.Create(isMobileCount,isNotMobileCount);
}

您可以通过元组的Item1Item2属性访问这两种信息。