2008-08-03 38 views

Répondre

8

Une solution, mais qui diffère la manipulation de la valeur nulle au code, pourrait être:

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

Cela ne produit pas exactement la même SQL, mais ne fournit le même résultat logique. La traduction de requêtes SQL "complexes" en LINQ n'est pas toujours simple.

0

Ce n'est pas une réponse complète pour vous, mais à gauche rejoindre pièce, vous pouvez utiliser l'opérateur DefaultIfEmpty comme ceci:

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' 

Je n'ai pas eu besoin de faire une groupby commandes encore, alors j'ai laissé cela de côté pour ne pas vous envoyer sur le mauvais chemin. Deux autres choses rapides à noter. J'ai été incapable de joindre réellement deux paramètres bien que, comme ci-dessus, il existe des moyens de contourner ce problème. Également ?? L'opérateur fonctionne vraiment bien à la place de l'isnull dans SQL.

0

Vous allez utiliser la construction join into pour créer une requête de groupe.

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

Juste Youse le code ci-dessus et cela fonctionne bien!