我有2张桌子: 'AllowedDates'
- DayID int PK
- Day datetime
'AllowedTimes'
- 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
我需要选择没有拒绝时间的用户(在UserDeniedTimes中记录)具体的DayID /小时/分钟
我尝试执行以下操作:
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,则会被选中。为什么?
[ADDED] 当我仅限制日期时,它可以正常工作:
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之间有什么区别?
[ADDED#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)
))) &&
作品
为什么?
答案 0 :(得分:1)
有时候重新解决问题会有所帮助:如果我读得不好,你就不希望用户有至少一个指定的DayID /小时/分钟的拒绝时间:
where !i.UserDeniedTimes.Any(
p => (p.AllowedDate.AllowedTimes.Any(
a1 => a1.DayID == aTime.DayID
&& a1.Hour == aTime.Hour
&& a1.Minute == aTime.Minute
))
)
这应该选择您想要的用户。如果没有,请用更多的词语告诉你究竟是什么 正在努力实现。