2012-06-07 62 views
0

我有2個表: 'AllowedDates'如何配置LINQ要求

- 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記錄)混凝土大衛·/小時/分鐘

我儘量做到以下幾點:

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 

但會選擇是否=大衛·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) 
         ))) && 

工作

爲什麼呢?

+0

DayID = 11,UserID = 20,Hour = 8, Minute = 30可能有另一條記錄。 –

+0

DayID = 11,UserID = 20,Hour = 8,Minute = 30沒有記錄。只有當DayID不存在時,此用戶記錄纔會被選中 – user994038

+0

是什麼問題? – user994038

回答

1

有時,它有助於改寫這個問題:如果我讀你很好,你不希望用戶中,有一個否定的時間至少有一個指定的大衛·/小時/分鐘:

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

這應該選擇你想要的用戶。如果不是,請用更多的話來告訴你 想要達到什麼目的。