2008-08-03 16 views

回答

8

一個方法,雖然可推遲處理空值的代碼,可能是:

DateTime yesterday = DateTime.Now.Date.AddDays(-1);

var collection= 
    from u in db.Universe 
    select new 
    { 
     u.id, 
     u.name, 
     MaxDate =(DateTime?) 
     (
      from h in db.History 
      where u.Id == h.Id 
      && h.dateCol < yesterday 
      select h.dateCol 
     ).Max() 
    }; 

這不會產生相同的SQL,但提供相同的邏輯結果。將「複雜」SQL查詢翻譯成LINQ並不總是直截了當的。

0

這是不是一個完整的答案,但在左連接件可以使用DefaultIfEmpty運營商,像這樣:

var collection = 
from u in db.Universe 
join history in db.History on u.id = history.id into temp 
from h in temp.DefaultIfEmpty() 
where h.dateCol < DateTime.Now.Date.AddDays(-1) 
select u.id, u.name, h.dateCol ?? '1900-01-01' 

我沒有必要做任何GROUPBY命令呢,所以我放棄了這一點,不會讓你走錯路。另外兩個要注意的事情。儘管如上所述,我一直無法真正加入兩個參數。另外,??在SQL中,操作符非常適合用來代替isnull。

0

您將要使用join into構造來創建組查詢。

TestContext db = new TestContext(CreateSparqlTripleStore()); 
var q = from a in db.Album 
     join t in db.Track on a.Name equals t.AlbumName into tracks 
     select new Album{Name = a.Name, Tracks = tracks}; 
foreach(var album in q){ 
    Console.WriteLine(album.Name); 
    foreach (Track track in album.Tracks) 
    { 
     Console.WriteLine(track.Title); 
    } 
} 
1
var collection= 
    from u in db.Universe 
    select new 
    { 
     u.id, 
     u.name, 
     MaxDate =(DateTime?) 
     (
      from h in db.History 
      where u.Id == h.Id 
      && h.dateCol < yesterday 
      select h.dateCol 
     ).Max() 
    }; 

只是有色上面的代碼,這應該能正常運行!