2012-03-08 115 views
0

我有一些困難,這條SQL語句轉換爲LINQ:轉換SQL左連接到LINQ

Declare @ind date, @outd date 
set @ind = '2012-03-17' 
set @outd = '2012-03-18' 

SELECT k.id 
FROM Kennels k 
LEFT JOIN (SELECT * 
      FROM Reservations 
      WHERE (DateIn >= @ind and DateIn < @outd) or (DateOut > @ind and DateOut <= @outd)) r ON k.id = r.Kennel_ID 
WHERE r.kennel_id is null 

的Linq:

Dim available = From k In Kennels _ 
        Group Join r In db.Reservations.Where(Function(fx) (fx.DateIn >= Date_From And fx.DateIn < Date_To) Or (fx.DateOut > Date_From And fx.DateOut <= Date_To)) On k Equals r.Kennel Into Group _ 
        From r In Group.DefaultIfEmpty 
        Where r.Kennel.ID Is Nothing 
        Select k 

與我的LINQ語句中的問題是,當r是什麼,查詢中的「Where r.Kennel.ID」部分已經過期。

我很感謝一些幫助重寫這個查詢!

感謝,

湯姆

+0

退房此鏈接:http://stackoverflow.com/questions/ 525194/linq-inner-join-vs-left-join – diaho 2012-03-08 04:54:14

回答

1

你可以改變Where r.Kennel.ID Is NothingWhere r Is Nothing

但在C#我會寫

var available = 
    from k in db.Kennels 
    where !k.Reservations.Any(r => r.DateIn >= Date_From && r.DateIn < Date_To) || (r.DateOut > Date_From && r.DateOut <= Date_To) 
    select k; 

,因爲我覺得它更容易閱讀。
對不起,我的VB beeing有點生疏,但我認爲你可以很容易地把它翻譯(||Or&&And!Not

+0

感謝您的幫助! 我用這個和我現有的查詢的組合,並得到它的工作。它本質上是沒有得到它的。 – Tom 2012-03-08 14:58:48