• 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

VPS Starter Arubacloud
0 głosów
241 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 176 wizyt
pytanie zadane 25 sierpnia 2019 w C# przez Moras Obywatel (1,620 p.)
0 głosów
1 odpowiedź 274 wizyt

93,032 zapytań

141,995 odpowiedzi

321,300 komentarzy

62,379 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...