5

現在の週に報告された合計時間の合計を返すクエリがあります。以下のコードは、正しい総時間数を返しますが、データベース内の特定のユーザーについては返しません。

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

1 に答える 1

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代わりに を使用するfromwhere
  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;
于 2012-04-20T12:21:04.517 に答える