5

where子句我有一個查詢應該返回本週總報告小時數的總和。 下面的代碼返回小時數的正確總數,但不返回數據庫中特定用戶的總數。Linq查詢,搞砸方法

public int reportedWeekTime(int currentWeek, string username) 
     { 
      var totalTime = (from u in context.Users 
         from r in context.Reports 
         from w in context.Weeks 
         from d in context.Days 
         where u.Id == r.UserId && r.weekNr.Equals(currentWeek) && r.Id == w.ReportId && w.DayId == d.Id 
         select d.Hour).DefaultIfEmpty(0).Sum(); 
      return totalTime; 
     } 

第一種方法返回數字24,這是正確的,但正如我所說的,不是針對特定用戶。

我想要做到這一點,但它給了我0回報。我究竟做錯了什麼?

public int reportedWeekTime(int currentWeek, string username) 
     { 
      var totalTime = (from u in context.Users 
         from r in context.Reports 
         from w in context.Weeks 
         from d in context.Days 
         where u.Id == r.UserId && r.weekNr.Equals(currentWeek) && r.Id == w.ReportId && w.DayId == d.Id && u.Username.Contains(username) 
         select d.Hour).DefaultIfEmpty(0).Sum(); 
      return totalTime; 
     } 
+0

也許你應該設置用戶名到你的班級的屬性。我知道WP7 Linq是不是很好,傳遞方法 – 2012-04-20 11:38:58

+0

的值,你需要使用加入http://code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9 – Habib 2012-04-20 11:41:35

+0

傳遞用戶名到像這樣的方法適用於我使用的另一個linq查詢,但不適用於此特定的查詢。 – rickard 2012-04-20 11:42:17

回答

2

更新 - 故障排除方法,創建一個新的匿名類與u.Username屬性,字符串的用戶名和比較。它會更容易想象什麼是要去

var users = (from u in context.Users 
      select new 
      { 
       UsernameDb = u.Username, 
       UsernameSearch = username, 
       Comparison = u.Username.Contains(username), 
      }).ToList(); 

原始

我將修改略有查詢:

  1. 使用join的,而不是from的與where條款
  2. 刪除DefaultIfEmpty(0)

(1)更多的可讀性,但我認爲(2)是你的問題

var totalTime = (from u in context.Users 
       join r in context.Reports on u.Id equals r.UserId 
       join w in context.Weeks on r.Id equals w.ReportId 
       join d in context.Days on w.DayId equals d.Id 
       where r.weekNr.Equals(currentWeek) && u.Username.Contains(username) 
       select d.Hour).Sum(); 

的緣故,我也將確保下面的查詢返回的結果。如果不是,那將是你的問題

var users = from u in context.Users 
      where u.Username.Contains(username) 
      select u; 
+0

我很想嘗試這個,但是select語句給了我errorcode「Operator」??'不能應用於'int'和'int'類型的操作數。「 – rickard 2012-04-20 12:25:06

+0

@rickard - 好的,我假設d.Hour是可空的。你有沒有嘗試刪除DefaultIfEmpty(0)?爲什麼添加? – Aducci 2012-04-20 12:28:09

+0

我有DefaultIfEmpty如果一個人添加了一個報告,但沒有小時addes它,這將返回值爲0.但問題仍然在這裏,我知道它應該retu對我來說是一種價值,但事實並非如此。它反而給我「鑄造值類型'Int32'失敗,因爲物化值爲null。結果類型的泛型參數或查詢必須使用可空類型。」 – rickard 2012-04-20 12:36:01