2012-10-22 38 views
0

我正在開發一個網站,該網站既有桌面客戶,也有移動客戶。對於分析,我想知道用戶是通過桌面還是移動設備訪問我的網站,因爲我在數據庫中有一個表,其中有幾列用於存儲用戶的設備詳細信息。在那裏我有一個名爲IsMobile的專欄,因爲我基於用戶的設備存儲真/假。現在我想要使用linq查詢來計算true和false。獲取單個表中兩列同一列的數量

我正在使用下面的代碼。

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; 
    } 

我得到正確的計數的細節,但是有兩個列表項一個計數是,另一個用於計數不,相反,我希望得到一個列表項目,既肯定又否定在計時

原樣: {Yes 20;無0} {是0;否10}

應該如何: {Yes 20;沒有10}

我是新來的linq查詢,請告訴我做錯了什麼?

+1

請澄清,你想要的總和是+否?您的示例解決方案似乎與您當前的代碼匹配。 – Trisped

+0

你的代碼有什麼問題? –

+0

我得到兩個列表中的項目,首先它計數是單獨計算,然後計算沒有單獨計算,而我想同時計算是和否 – Subha

回答

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)} 
      }; 
+0

沒有組,我將如何獲得計數? – Subha

+0

在你的主集「d」中計數 – Nogard

+0

我可以使用d來計數,但我想將結果賦給我的模型對象屬性是和否,那我將如何不分組?我不想使用新的變量 – Subha

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屬性來訪問這兩個信息。

+0

也許你可以在1中使用定義的變量查詢? – shahkalpesh

相關問題