Πώς μπορώ πιο κομψά ρητή αριστερά από κοινού με συνολική SQL ως ερώτημα LINQ

ψήφοι
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
Δημοσιεύθηκε 03/08/2008 στις 22:22
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
8

Μια λύση, αν και αυτό που μεταθέτει το χειρισμό της μηδενικής τιμής στον κώδικα, θα μπορούσε να είναι:

DateTime χθες = 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 δεν είναι πάντα εύκολο.

Απαντήθηκε 03/08/2008 στις 22:31
πηγή χρήστη

ψήφοι
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()
    };

Απλά youse τον παραπάνω κώδικα και αυτό θα πρέπει να δουλεύουν μια χαρά!

Απαντήθηκε 18/04/2016 στις 12:16
πηγή χρήστη

ψήφοι
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);
    }
}
Απαντήθηκε 17/09/2008 στις 06:28
πηγή χρήστη

ψήφοι
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 εντολές ακόμα, έτσι έφυγα ότι από ώστε να μην σας στείλει σε λάθος δρόμο. Δύο άλλα γρήγορο πράγματα που πρέπει να λάβετε υπόψη. Έχω ήταν σε θέση πραγματικά να ενταχθούν σε δύο παραμέτρους, αν και όπως παραπάνω, υπάρχουν τρόποι για να πάρετε γύρω από αυτό. Επίσης το ?? χειριστής λειτουργεί πολύ καλά στη θέση του IsNull σε SQL.

Απαντήθηκε 28/08/2008 στις 20:09
πηγή χρήστη

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