Linq 查询,弄乱了方法中的 where 子句
本文关键字:where 子句 方法 乱了 查询 Linq | 更新日期: 2023-09-27 18:31:42
我有一个查询,它应该返回本周报告的总小时数。下面的代码返回正确的总小时数,但不返回数据库中特定用户的小时数。
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;
}
更新 - 故障排除方法,创建一个新的匿名类,其中包含 u.Username 属性、字符串用户名和比较。可视化正在发生的事情会更容易
var users = (from u in context.Users
select new
{
UsernameDb = u.Username,
UsernameSearch = username,
Comparison = u.Username.Contains(username),
}).ToList();
源语言
我会稍微修改您的查询:
- 在
where
子句中使用join
而不是from
- 移除
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;