Nasıl en zarif ekspres sol LINQ sorgu olarak agrega SQL ile katılırım

oy
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
Oluştur 03/08/2008 saat 22:22
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
8

Bir çözelti, kod boş değer taşıma geciktirdiğini de olsa, olabilir:

DateTime dün = 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()
    };

Bu tam olarak aynı SQL üretmez, ama aynı mantıksal sonucu sağlıyor. LINQ için "karmaşık" SQL sorguları çevirmek her zaman kolay değildir.

Cevap 03/08/2008 saat 22:31
kaynak kullanıcı

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

Sadece yukarıdaki kodu Youse ve bu ince çalışması gerekir!

Cevap 18/04/2016 saat 12:16
kaynak kullanıcı

oy
0

Kullanmak istediğiniz gidiyoruz join intobir grup sorgu oluşturmak yapısı.

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);
    }
}
Cevap 17/09/2008 saat 06:28
kaynak kullanıcı

oy
0

Bu sizin için tam bir cevap değil, ama solda bunu gibi DefaultIfEmpty operatörünü kullanabilirsiniz parçası katılmak:

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'

Ben herhangi bir GroupBy henüz komutları yapma ihtiyacı olmadı, bu yüzden yanlış yoldan göndermeyecek olarak ortaya çıktı. Diğer iki hızlı Unutulmaması gereken. Yukarıdaki gibi etrafında almak için yolları olsa da aslında iki parametre katılamayacağınızdan olmuştur. Ayrıca ?? Operatör SQL ISNULL yerine gerçekten iyi çalışıyor.

Cevap 28/08/2008 saat 20:09
kaynak kullanıcı

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