5

Tôi có một truy vấn trả về tổng số giờ được báo cáo cho tuần hiện tại. Mã dưới đây trả về tổng số giờ chính xác nhưng không trả về một người dùng cụ thể trong cơ sở dữ liệu.Truy vấn LINQ, làm sai lệch mệnh đề where trong phương thức

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

Phương thức đầu tiên trả về số 24, đúng là chính xác nhưng như tôi đã nói, không phải cho người dùng cụ thể.

Tôi đang cố gắng làm điều này, nhưng nó mang lại cho tôi 0 lợi nhuận. Tôi đang làm gì sai?

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

Có thể bạn nên đặt tên người dùng thành thuộc tính trong lớp học của bạn. Tôi biết WPQ Linq không phải là tốt với thông qua các giá trị của một phương pháp –

+0

bạn cần phải sử dụng tham gia http://code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9 – Habib

+0

Chuyển tên người dùng đến phương thức như thế này làm việc cho một truy vấn LINQ tôi sử dụng, nhưng không cho một cụ thể này. – rickard

Trả lời

2

Cập nhật - phương pháp khắc phục sự cố, tạo ra một lớp ẩn danh mới với tài sản u.Username, tên người dùng chuỗi, và so sánh. Nó sẽ được dễ dàng hơn để hình dung những gì đang xảy ra

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

gốc

tôi sẽ sửa đổi truy vấn của bạn một chút:

  1. Sử dụng join 's thay vì from' s với where khoản
  2. Xóa DefaultIfEmpty(0)

(1) là nhiều hơn cho dễ đọc, nhưng tôi nghĩ (2) là nguyên nhân của vấn đề của bạn

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(); 

Tôi cũng chắc chắn rằng truy vấn sau đây trả về kết quả. Nếu không, đó sẽ là vấn đề của bạn

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

Tôi rất thích thử điều này, nhưng câu lệnh chọn cho tôi mã lỗi "Toán tử '??' không thể áp dụng cho các toán hạng kiểu 'int' và 'int'" – rickard

+0

@rickard - Ok, tôi giả định d.Hour là nullable. Bạn đã thử loại bỏ DefaultIfEmpty (0)? Tại sao bạn thêm vào đó? – Aducci

+0

Tôi đã có DefaultIfEmpty nếu một người đã thêm một báo cáo nhưng không có số giờ cộng thêm vào đó, điều đó sẽ trả về giá trị 0. Nhưng vấn đề vẫn còn ở đây, tôi biết nó nên retu rn cho tôi một giá trị, nhưng nó không. Thay vào đó nó mang lại cho tôi "Giá trị truyền đến loại giá trị 'Int32' không thành công vì giá trị vật hoá là rỗng. Tham số chung của loại kết quả hoặc truy vấn phải sử dụng một loại nullable." – rickard