2008-08-03 18 views

Odpowiedz

8

rozwiązania, aczkolwiek odracza postępowania z wartością null do kodu, mogą być:

DateTime wczoraj = 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() 
    }; 

nie produkują dokładnie ten sam SQL, ale daje ten sam wynik logiczny. Tłumaczenie "złożonych" zapytań SQL na LINQ nie zawsze jest proste.

0

To nie jest pełna odpowiedź dla ciebie, ale po lewej dołączyć kawałek można użyć operatora DefaultIfEmpty tak:

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' 

nie miałem potrzebę zrobienia jeszcze żadnych poleceń GroupBy, więc zostawiłem to, aby nie wysłać cię na złą drogę. Dwie inne ważne rzeczy do zapamiętania. Nie udało mi się połączyć dwóch parametrów, chociaż jak wyżej, istnieją sposoby na obejście tego problemu. Ponadto, ?? operator działa naprawdę dobrze na miejscu isnull w SQL.

0

Będziesz chciał użyć konstrukcji join into, aby utworzyć zapytanie grupowe.

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() 
    }; 

Wystarczy youse powyższy kod i to powinno działać w porządku!