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 ...

它工作正常,但有一个例外。如果用户在某一天在 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

有时它有助于重新表述问题:如果我读得很好,您不希望用户具有至少一个指定的 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 回答