Zamiana Select SQL na LINQ C#

0

Witam, planuje zrobić aplikacje w MVC 3 przy użyciu ADO.NET ENTITY DATA MODEL i nie wiem jak w LINQ zapisać Selecta poniższego

SELECT *
FROM [Wypozyczalnia].[dbo].[Grupy] as g JOIN dbo.Statusy as s ON g.IDStatus=s.IDStatus
WHERE IDGrupy in (Select IDGrupy FROM dbo.GrupyAtrybuty Group by IDGrupy)

0

Przykład:

var zmienna= from t in baza.Typies
               where t.uzytkownik == User.Identity.Name
                  select t;
3

to co zrobiłeś jest zwyczajnie bez sensu. group by bez funkcji agregującej to to samo, co distinct i tak samo sprowadza się do przejechania po całej tabeli (jeśli nie ma indeksu).
zapytanie powinno wyglądać tak:

select * from Grupy g 
join Statusy s on g.IDStatus = s.IDStatus
where exists (select * from GrupyAtrybuty ga where ga.IDGrupy = g.IDGrupy)

przy okazji poprawiłem złe użycie nazwy bazy danych - albo używasz jej wszędzie, albo nigdzie. konsekwencja ponad wszystko. powinieneś też używać angielskiego słownictwa do nazywania tabel, pól i innych obiektów bazy danych, ale to już kwestia dyskusyjna.

c#, wersja lambda:

			var G = new List<Grupy> { new Grupy() { IDStatus = 1, IDGrupy = 1 }, new Grupy() { IDStatus = 2, IDGrupy = 2 } };
			var S = new List<Statusy> { new Statusy() { IDStatus = 1 } };
			var A = new List<GrupyAtrybuty> { new GrupyAtrybuty() { IDGrupy = 1 } };

			var r = from g in G
					join s in S on g.IDStatus equals s.IDStatus
					join a in A on g.IDGrupy equals a.IDGrupy
					select g;

wersja linq:

var r = G.Where(g => S.Exists(s => s.IDStatus == g.IDStatus) && A.Exists(a => a.IDGrupy == g.IDGrupy));

linq i tak nie będzie wyciągać wszystkich danych i potem ich porównywać, zostanie wygenerowany sql i to baza danych wykona wszystkie operacje.

abstrahując od tego, linq posiada metodę GroupBy, a wyrażenia lambda group ... by ... into ... - polecam google.

3

to źle Ci się wydaje. ciekawi mnie takie podejście - "nie znam się dobrze, ale uważam, że nie masz racji". dodałeś group by, kierując się pewnymi przesłankami, a czy zweryfikowałeś je? porównałeś chociaż czas wykonania zapytania przed i po? dlaczego nie użyłeś distinct, które służy specjalnie do wyciągnięcia niepowtarzających się danych?

przeanalizuj i porównaj plan wykonania Twojego i mojego zapytania, narzędzie do tego masz wbudowane w management studio, tylko obejrzyj sobie właściwy plan (nie ten estimated, bo czasem pokazuje głupoty). każda sensowna baza danych posiada coś takiego, jak optymalizator. mechanizm ten rozbiera zapytanie na części składowe i składa taki plan wykonania zapytania, który według niego wykona się najszybciej. mnóstwo danych jest buforowanych. w mssql budowane są tymczasowe "indeksy", np. typu hash pozwalające na porównywanie zbiorów w czasie liniowym. itp, itd.
inna sprawa, że optymalizator nie zawsze uwzględnia istniejące indeksy, które na zdrowy chłopski rozum powinny mu bardzo przyspieszyć sprawę.

obejrzyj plan zapytania, potem dodaj brakujące indeksy, a potem obejrzyj plan zapytania raz jeszcze i wyciągnij wnioski.

2

nic nie wyciągasz wcześniej! to był tylko przykład, żebym mógł sobie łatwo sprawdzić zapytanie.
nie masz zielonego pojęcia, jak działa linq to sql, prawda? większość metod nie wyciąga danych, służą tylko do wygenerowania sql. zatem trzy razy wywołane .Where() nic nie wyciągnie z bazy. dane są fizycznie wyciągane dopiero, kiedy wywołasz Single*, First*, ToList() albo ToArray(), albo przy iterowaniu po "wynikach"; być może jeszcze w kilku innych przypadkach, ale nie chce mi się sprawdzać.
a zapełnieniem pamięci bym się nie przejmował, wyciągnięcie z bazy takiej ilości danych trwałoby koszmarnie długo, nawet nie jestem pewien, czy by się udało, bo sql server też będzie potrzebować trochę pamięci na wygenerowanie tylu wyników, a do testów pewnie korzystasz z lokalnego serwera. zresztą pomyśl, jak dużo musiałbyś mieć grup, statusów lub atrybutów żeby zobaczyć OutOfMemoryException.

możesz więc spokojnie "wyciągnąć dane" do zmiennych G, S i A, tylko nie nazywaj tak tych zmiennych, bo pierwszy lepszy programista, który zobaczy kiedyś takie coś wTwoim kodzie połamie Ci palce. pamiętaj, żeby nie użyć po drodze ToList czy ToArray. potem możesz użyć żywcem zapytania, które Ci podałem.
jest i druga opcja - myślałem, że wpadniesz na to sam - jest taka:

var r = G.Where(g => dc.Statusy.Exists(s => s.IDStatus == g.IDStatus) && dc.GrupyAtrybuty.Exists(a => a.IDGrupy == g.IDGrupy));

jeszcze na koniec jeden duperel - GrupyAtrybuty to po polsku? AtrybutyGrup chyba brzmi trochę lepiej.

na następny raz najpierw poszukaj na google i/lub sprawdź samemu, dopiero potem pytaj na forum.

0

a, Exists() nie jest tłumaczone na zapytanie sql, być może dlatego, że łączysz lokalne linq z linq na bazie danych. użyj zapytania w wersji lambda, nie mam czasu składać na nowo części w linq i sprawdzać, czy każda z metod ma swój odpowiednik w sql.

btw po co deklarujesz pustą zmienną A? po co ten Include? mam wrażenie, że poruszasz się po omacku. use the F1 key, George.

0

co to znaczy "nie działają"? masz podany przykład, nie kompiluje się, kompilator zwraca treść błędu, ide pokazuje ją. przeczytaj ją ze zrozumieniem i poszukaj podpowiedzi na google.
ja nie jestem wróżką, żeby zgadywać co i dlaczego nie działa.

1

słucham? wali mnie zawartość pola reputacja, wprowadzono to kilka minut temu, a rozmawiasz z kolesiem, który jest tu od samego początku. nie rozumiesz zasad tego forum, nie spojrzałeś nawet na podstawowe informacje o mnie, a walisz powyższego posta.

kompletnie nie rozumiem skąd ten wybuch. podałem Ci przykłady, twierdzisz, że nie działają i bez podania opisu błędu liczysz na to, że a) nie dysponując Twoim kodem ani Twoją bazą danych zgadnę co to za błędy i je naprawię b) gdybym dysponował kodem i bazą to niby miałbym czas i ochotę uruchamiać to u siebie, bo Tobie nie chce się przeczytać komunikatu z treścią błędu i wkleić go do google albo chociaż na forum. przepraszam. jeden komunikat wkleiłeś, wyjaśniłem skąd najprawdopodobniej się on bierze, nic z tym nie zrobiłeś, nie wkleiłeś co nie tak z wyrażeniem lambda. zero własnej inwencji, tylko pretensja do świata, że nie pocałował w pupcię.

nie rozumiem też, o co Ci chodzi z przeczytaniem paru zdań wstecz. generalnie nie jestem zbyt uważną osobą, podpowiedz mi co przegapiłem.

0

jaki agent... usunął wszystkie swoje posty [glowa]

1 użytkowników online, w tym zalogowanych: 0, gości: 1