0

2 つのテーブルがあります:「AllowedDates」

- DayID int PK
- Day datetime

「許可された時間」

- TimeID int PK
- DayID int FK
- Hour int
- Minute int

また、テーブル「ユーザー」があります:

- ID int PK
- FirstName nvarchar(max)
...

およびテーブル「UserDeniedTimes」:

DayID int FK
UserID int FK
Hour int
Minute int

具体的な DayID/Hour/Minute の時間 (UserDeniedTimes に記録) を拒否しないユーザーを選択する必要があります

私は次のことをしようとします:

var result = from i in _dbContext.Users
where i.UserDeniedTimes.All(
    p => (!p.AllowedDate.AllowedTimes.Any(
        a1 => a1.DayID == aTime.DayID
           && a1.Hour == aTime.Hour
           && a1.Minute == aTime.Minute
    ))
)
select new ...

正常に動作しますが、1 つの例外があります。ユーザーが UserDeniedTimes に記録を持っている日と別の時間がある場合、このユーザーも選択されません。たとえば、UserDeniedTimes には次のレコードがあります。

DayID = 10
UserID = 20
Hour = 14
Minute = 30

aTime に次の値がある場合、このユーザーは選択されません。

DayID = 10
Hour = 9
Minute = 30

ただし、DayID = 11 の場合は選択されます。なぜですか?

[追加]日だけで制限すると正しく動作します:

var result = from i in _dbContext.Users
where i.UserDeniedTimes.All(
    p => (!p.AllowedDate.AllowedTimes.Any(
        a1 => a1.DayID == aTime.DayID
    ))
)
select new ...

しかし、私が書いたときは機能しません:

var result = from i in _dbContext.Users
where i.UserDeniedTimes.All(
    p => (!p.AllowedDate.AllowedTimes.Any(
        a1 => a1.Hour == 14
    ))
)
select new ...

なぜ?魔法の DayID と Hour の違いは何ですか?

[追加 #2]

                     ((time == null) || i.UserDeniedTimes.All(p => 
                        //p.AllowedDate.AllowedTimes.Any(a1 => a1.DayID != 33) && 
                        (p.AllowedDate.AllowedTimes.Any(a2 => a2.Hour != 14)
                        ))) &&

動作しません

                     ((time == null) || i.UserDeniedTimes.All(p => 
                        p.AllowedDate.AllowedTimes.Any(a1 => a1.DayID != 33) && 
                        //(p.AllowedDate.AllowedTimes.Any(a2 => a2.Hour != 14)
                        ))) &&

作品

なぜ?

4

1 に答える 1

1

問題を言い換えると、問題が解決する場合があります。よく読んだ場合、少なくとも 1 つの指定された DayID/Hour/Minute を持つ拒否時刻を持つユーザーは必要ありません。

where !i.UserDeniedTimes.Any(
    p => (p.AllowedDate.AllowedTimes.Any(
        a1 => a1.DayID == aTime.DayID
           && a1.Hour == aTime.Hour
           && a1.Minute == aTime.Minute
    ))
)

これにより、必要なユーザーが選択されます。そうでない場合は、正確に何を達成しようとしているのかをもう少し言葉で教えてください.

于 2012-06-08T17:34:33.487 に答える