如何配置LINQ请求

时间:2012-06-07 18:14:30

标签: linq linq-to-entities

我有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)
                        ))) &&

作品

为什么?

1 个答案:

答案 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
    ))
)

这应该选择您想要的用户。如果没有,请用更多的词语告诉你究竟是什么 正在努力实现。