我正在开发一个拥有桌面和移动客户的网站。为了分析,我想知道用户是通过桌面还是移动设备访问我的网站,因为我在数据库中有一个表,其中有几列用于存储用户的设备详细信息。因为我有一个名为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查询的新手,请告诉我我做错了什么?
答案 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);
}
您可以通过元组的Item1
和Item2
属性访问这两种信息。