Skocz do zawartości

[sfera] Listing asortymentu - optymalizacja

Polecane posty

Poproszę o podpowiedź jak, w ramach Sfery, zoptymalizować poniższy kod pod kątem czasu wykonania - iteracji po pozycjach asortymentu.

using (var sfera = UruchomSfere())
{
	IAsortymenty menedzerAsortymentow = sfera.PodajObiektTypu<IAsortymenty>();
	IEnumerable<Asortyment> wszystkie = menedzerAsortymentow.Dane.Wszystkie();

	foreach (var towar in wszystkie)
	{
		PozycjaCennika poz = towar.PozycjeCennika.Where(a => a.Cennik.PoziomCen.Nazwa == "Detaliczny").FirstOrDefault();

		cena = Decimal.ToInt32(poz.CenaBrutto * 100);

		foreach (KodKreskowy kod in towar.PodstawowaJednostkaMiaryAsortymentu.KodyKreskowe)
		{
			linia = towar.Nazwa + " " + kod.Kod + " " + cena;
			Console.WriteLine(linia);
		}                        	
	}
}

 

Link to postu

Najprostszym rozwiązaniem jest przekazanie dodatkowych parametrów do metody Wszystkie, które pozwolą załadować wszystkie dane jednym zapytaniem. Wówczas podczas iteracji  dane nie będą musiały być doładowywane.

IEnumerable<Asortyment> wszystkie = menedzerAsortymentow.Dane.Wszystkie("PozycjeCennika.Cennik.PoziomCen", "PodstawowaJednostkaMiaryAsortymentu.KodyKreskowe");

Jednak można to zoptymalizować jeszcze bardziej. Proszę zauważyć, że z wszystkich danych asortymentu potrzebna jest jedynie nazwa. Można więc stworzyć zapytanie, które wczyta jedynie te dane, które są konieczne.

using (var sfera = UruchomSfere())
{			
	IAsortymenty menedzerAsortymentow = sfera.PodajObiektTypu<IAsortymenty>();
	var wszystkie = menedzerAsortymentow.Dane.Wszystkie().Select(x => new
	{
		x.Nazwa,
		Cena = x.PozycjeCennika.Where(a => a.Cennik.PoziomCen.Nazwa == "Detaliczny").Select(pc => pc.CenaBrutto).FirstOrDefault(),
		Kody = x.PodstawowaJednostkaMiaryAsortymentu.KodyKreskowe.Select(k => k.Kod),
	});

	foreach (var towar in wszystkie)
	{
		var cena = Decimal.ToInt32(towar.Cena * 100);

		foreach (var kod in towar.Kody)
		{
			var linia = towar.Nazwa + " " + kod + " " + cena;
			Console.WriteLine(linia);
		}
	}
}

 

  • Dziękuję 1
Link to postu
×
×
  • Dodaj nową pozycję...