• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[ASP][EF] Liczba zapytań do bazy danych

Object Storage Arubacloud
0 głosów
161 wizyt
pytanie zadane 15 czerwca 2018 w C# przez HDRGXS Początkujący (470 p.)
edycja 15 czerwca 2018 przez HDRGXS

Witam,

Chciałbym prosić was o pomoc przy budowie zapytań do bazy danych.

Zacznę może od zaprezentowania 3 wersji kodu do pobrania danych w relacji wiele do wielu.

var query = (from s in db.Spectacles
    select new SpectacleDTO
    {
        Id = s.Id,
        Name = s.Name,
        Directors = s.Directors.Select(x => new DirectorDTO
        { 
            Id = x.Id, 
            FirstName = x.FirstName, 
            SecondName = x.SecondName, 
            LastName = x.LastName 
        }),
        Time = s.Time.ToString().Remove(s.Time.ToString().Length-3)
    }).ToList();
return query;
            

var result = new List<SpectacleDTO>();
var spectacles = await db.Spectacles.ToListAsync();
var directors = await db.Directors.ToListAsync();

foreach (var row in spectacles)
{
    result.Add(new SpectacleDTO() 
    {
        Id = row.Id,
        Name = row.Name,
        Directors = directors.Where(x => row.Directors.Any(y => y.Id.Equals(row.Directors))).Cast<DirectorDTO>().ToList(),
        Time = row.Time.ToString(@"hh\:mm")
    });
}
return result;
     
       
return db.Spectacles.Select(x => new SpectacleDTO
{
    Id = x.Id,
    Name = x.Name,
    Directors = x.Directors.Select(y => new DirectorDTO 
    {
        Id = y.Id,
        FirstName = y.FirstName,
        SecondName = y.SecondName,
        LastName = y.LastName
    }),
    Time = x.Time.ToString().Remove(x.Time.ToString().Length-3)
}).ToList();

Nie wiem, który z tych kodów jest najlepszy i zakładam, że można to zrobić jeszcze lepiej. Dlatego prosiłbym o pomoc w zbudowaniu czegoś, co jest dobre do wykorzystania w pracy ;)

Pozdrawiam

komentarz 15 czerwca 2018 przez HDRGXS Początkujący (470 p.)
Najszybszy w testach wypadał ten ostatni kod ;)
1
komentarz 16 czerwca 2018 przez NowyUrzydgownig Mądrala (5,090 p.)

@HDRGXS, Skorzystaj z automappera.

komentarz 17 czerwca 2018 przez HDRGXS Początkujący (470 p.)
Ciekawa opcja z której myślę, że skorzystam. Jednak chciałbym też poznać inne metody rozwiązania problemu. Wiadomo, aby lepiej odnajdywać się w języku i wzorcach ;)
1
komentarz 17 czerwca 2018 przez NowyUrzydgownig Mądrala (5,090 p.)
Nie wiem właściwie na jakiej bazie danych operujesz, ale kluczową różnicą w tworzeniu zapytań do baz danych jest to czy operujesz na IEnumerable, czy IQueryable. Mógłbyś pobrać za pomocą IQueryable odpowiednie rekordy i krotki, a później w IEnumerable je po prostu obrobić według potrzeb.
komentarz 17 czerwca 2018 przez HDRGXS Początkujący (470 p.)
Ogólnie baza stoi na Azurze. Więc mamy do czynienia z t-sql i IQueryable  jeśli się nie mylę.
1
komentarz 17 czerwca 2018 przez NowyUrzydgownig Mądrala (5,090 p.)
Ogólnie różnica między IQueryable i IEnumerable jest taka, że to pierwsze wykonuje się po stronie bazy danych. Możesz spróbować wykonać zapytanie używając do tego IQueryable i IEnumerable i porównać szybkość wykonywania obu zapytań. Zamiast zwracać IEnumerable<Spectacle> zwracaj IQueryable<Spectacle>.
komentarz 17 czerwca 2018 przez HDRGXS Początkujący (470 p.)
edycja 19 czerwca 2018 przez HDRGXS

Niezależnie czy zwracam IQuerable czy IEnumerable czas mam ten sam. Prawdopodobnie musiałbym przeprowadzić ten test na większym  obciążeniu, jedno zapytanie na raz to niestety za mało.

Mój kod testujący

db.Database.Log = messaege => Debug.WriteLine(messaege);
var s1 = Stopwatch.StartNew();
var data = new DataAccess.GetFromDB(db).Spectacles();

if (!data.Any())
{
    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}
s1.Stop();
            
var s2 = Stopwatch.StartNew();
var datt = new DataAccess.GetFromDB(db).Spectacles2();

if (!datt.Any())
{
    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}
s2.Stop();

Przy czym jedna z metod zwraca IQuerable druga IEnumerable. Zapytanie w nich jest to samo. Czyli:

return db.Spectacles.Select(s => new SpectacleDTO()
{
    Id = s.Id,
    Name = s.Name,
    Directors = s.Directors.Select(d => new DirectorDTO()
    {
        Id = d.Id,
        FirstName = d.FirstName,
        SecondName = d.SecondName,
        LastName = d.LastName
     }),
    Time = s.Time
});

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 148 wizyt
pytanie zadane 25 sierpnia 2019 w C# przez Moras Obywatel (1,620 p.)
0 głosów
1 odpowiedź 260 wizyt

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...