0

我正在开发一个同时拥有桌面和移动客户的网站。为了进行分析,我想知道用户是通过桌面设备还是移动设备访问我的网站,因为我在数据库中有一个表,其中有几列用于存储用户的设备详细信息。我有一个名为 IsMobile 的列,因为我根据用户的设备存储真/假。现在我想使用 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;
    }

我得到了正确的计数详细信息,但是有两个列表项,一个用于计数是,另一个用于计数否,相反,我想通过一次计算是和否来获得单个列表项

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

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

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

4

2 回答 2

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)}
            };
于 2012-10-22T08:37:57.540 回答
1

IList<IsMobile>当您只想知道有多少项目IsMobile == true以及有多少项目时,为什么要选择 a 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属性访问这两个信息。

于 2012-10-22T08:00:11.657 回答