Jak mohu nejvíce elegantně express vlevo spojit s agregátní SQL jako LINQ dotazu

hlasů
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
Položena 03/08/2008 v 22:22
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
8

Roztok, byť defers manipulace s nulovou hodnotou na kód, mohou být:

DateTime včera = 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()
    };

To neprodukuje přesně stejnou SQL, ale poskytují stejný logický výsledek. Překlady „složité“ SQL dotazy LINQ není vždy jednoduché.

Odpovězeno 03/08/2008 v 22:31
zdroj uživatelem

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

Jen Youse výše uvedený kód, a to by mělo fungovat v pohodě!

Odpovězeno 18/04/2016 v 12:16
zdroj uživatelem

hlasů
0

Budeš chtít používat join intokonstrukt pro vytvoření dotazu skupiny.

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);
    }
}
Odpovězeno 17/09/2008 v 06:28
zdroj uživatelem

hlasů
0

Nejedná se o plnou odpověď pro vás, ale na levé straně připojit kus můžete použít operátor DefaultIfEmpty třeba takto:

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'

Neměl jsem potřebu udělat ještě některý groupby příkazy, a tak jsem odešel, že tak, jak se to poslat vás na špatnou cestu. Dva další rychlé věci poznamenat. Byl jsem schopen skutečně připojit na dvou parametrech ačkoli jak je uvedeno výše existují způsoby, jak se dostat kolem ní. Také ?? Provozovatel funguje opravdu dobře na místě IsNull v SQL.

Odpovězeno 28/08/2008 v 20:09
zdroj uživatelem

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