W jaki sposób najbardziej elegancko express lewe sprzężenie z kruszywa LINQ kwerendy SQL jako

głosy
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
Utwórz 03/08/2008 o 22:22
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
8

Roztwór, aczkolwiek odsuwa obsługi zerowej wartości w kodzie mogą być:

DateTime wczoraj = 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 nie produkuje dokładnie ten sam SQL, ale daje ten sam wynik logiczny. Tłumaczenia „kompleks” zapytań SQL do LINQ nie zawsze jest proste.

Odpowiedział 03/08/2008 o 22:31
źródło użytkownik

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

Wystarczy youse powyższy kod i to powinno działać w porządku!

Odpowiedział 18/04/2016 o 12:16
źródło użytkownik

głosy
0

Będziesz chcesz używać join intokonstrukt utworzyć kwerendę grupy.

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);
    }
}
Odpowiedział 17/09/2008 o 06:28
źródło użytkownik

głosy
0

To nie jest pełna odpowiedź dla ciebie, ale po lewej dołączyć kawałek można użyć operatora DefaultIfEmpty tak:

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'

Nie miałem potrzebę zrobienia poleceń któregokolwiek GroupBy jeszcze, więc wyszedłem, że obecnie, aby nie wysłać cię na złą drogę. Dwóch innych szybkich rzeczy zauważyć. I nie były w stanie właściwie przyłączyć dwóch parametrów chociaż jak wyżej istnieją sposoby, aby dostać się wokół niego. Również ?? Operator działa bardzo dobrze w miejsce ISNULL w SQL.

Odpowiedział 28/08/2008 o 20:09
źródło użytkownik

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