Comment puis-je la plus élégante gauche avec SQL Express joindre ensemble comme requête LINQ

voix
18

SQL:

SELECT
   u.id,
   u.name,
   isnull(MAX(h.dateCol), '1900-01-01') dateColWithDefault
FROM universe u
LEFT JOIN history h 
   ON u.id=h.id 
   AND h.dateCol<GETDATE()-1
GROUP BY u.Id, u.name
Créé 03/08/2008 à 22:22
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
8

Une solution, bien que celui qui reporte la manipulation de la valeur nulle à l'aide du code, peut être:

DateTime 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. Traduire les requêtes SQL « complexes » à LINQ est pas toujours simple.

Créé 03/08/2008 à 22:31
source utilisateur

voix
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!

Créé 18/04/2016 à 12:16
source utilisateur

voix
0

Vous allez vouloir utiliser la join intoconstruction 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);
    }
}
Créé 17/09/2008 à 06:28
source utilisateur

voix
0

Ce n'est pas une réponse complète pour vous, mais sur la jointure gauche 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 ne l'ai pas eu besoin de faire une groupby commandes encore, alors je suis parti que comme vous pas envoyé le mauvais chemin. Deux autres choses rapides à noter. Je suis incapable de se joindre en fait sur deux paramètres bien que ci-dessus, il existe des moyens de la contourner. Également ?? opérateur travaille très bien à la place de l'isnull dans SQL.

Créé 28/08/2008 à 20:09
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more