Skocz do zawartości

Limit danych w SDK

Polecane posty

Dzień dobry,

w jaki sposób można dodać limit pobieranych danych przez sdk ?

Chodzi o to że ilość danych do jednorazowego pobrania jest tak duża że dostaję time out od serwera.

Próbowałam coś takiego

IZamowieniaOdKlientow zamowienia = sfera.PodajObiektTypu<IZamowieniaOdKlientow>();
zamowienia.Dane.Wszystkie()
.Where(z => z.FlagaWlasna.Id == 123)
.Take(50)

ale tu również jest time out

-----

edit:

coś tu jest nie tak,

dodałam limit po dacie wystawienia na dzień gdzie jest 60 zk i dalej jest time out.

Co ciekawe wciągnęłam zapytanie które się wtedy się wykonuje i w management studio robi się ono w sekundę ...

 

Ktoś ma jakikolwiek pomysł co z tym zrobić ?

 

Poniżej zwracany wyjątek

Cytat

System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Upłynął limit czasu wykonywania. Limit upłynął przed ukończeniem operacji lub serwer nie odpowiada. ---> System.ComponentModel.Win32Exception: Upłynął limit czasu operacji oczekiwania
   --- Koniec śladu stosu wyjątków wewnętrznych ---
   w System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   w System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   w System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   w System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   w System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   w System.Data.SqlClient.SqlDataReader.get_MetaData()
   w System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
   w System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   w System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   w System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   w System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   w System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   w System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
   w System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior, ObjectContext objectContext)
   --- Koniec śladu stosu wyjątków wewnętrznych ---
   w System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior, ObjectContext objectContext)
   w System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)
   w System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   w System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__26_0()
   w System.Lazy`1.CreateValue()
   w System.Lazy`1.LazyInitValue()
   w System.Lazy`1.get_Value()
   w System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
   w System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   w System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   w goBasketFakturowacz.Form1.button1_Click(Object sender, EventArgs e) w \Form1.cs:wiersz 152
   w System.Windows.Forms.Control.OnClick(EventArgs e)
   w System.Windows.Forms.Button.OnClick(EventArgs e)
   w System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   w System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   w System.Windows.Forms.Control.WndProc(Message& m)
   w System.Windows.Forms.ButtonBase.WndProc(Message& m)
   w System.Windows.Forms.Button.WndProc(Message& m)
   w System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   w System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   w System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

 

 

 

 

Edytowane przez Anna Sałacińska
Link to postu

Całość wygląda tak jak poniżej

te dodatkowe klasy to tak na dobrą sprawę proste struktury potrzebne do innego systemu. To znaczy zawierają metody ale na tym etapie żadna nie jest uruchamiana.

Sklep.flaga.id zawiera identyfikator zapisany w konfigu programu

dataOd i dataDo to komponenty System.Windows.Forms.DateTimePicker
zkBindingSource to System.Windows.Forms.BindingSource ale do tej linijki już nie dochodzi.

I małe sprostowanie, wczoraj napisałam że zapytanie zwraca 60 zk, teraz zauważyłam że tam są pozycje dokumentów czyli zk jest około 30 ponieważ większość ma po 2 pozycje.

using (Uchwyt sfera = uruchomSfere())
{

    IZamowieniaOdKlientow zamowienia = sfera.PodajObiektTypu<IZamowieniaOdKlientow>();
    ITypyAdresu typyAdresu = sfera.PodajObiektTypu<ITypyAdresu>();
    int rodzajeKontaktu = sfera.PodajObiektTypu<IRodzajeKontaktu>().DaneDomyslne.Email.Id;

    int flaga = sfera.PodajObiektTypu<IFlagiWlasne>().Dane.Wszystkie().Where(f => f.Id == Sklep.flaga.id).First().Id;
    var dataSource = zamowienia.Dane.Wszystkie()
            .Where(z => 
                     
            z.DataWprowadzenia>=dataOd.Value
            && 
            z.DataWprowadzenia <= dataDo.Value
            &&
            z.FlagaWlasna.Id == flaga)
                    
            .Select(select => new Zk()
            {
                id = select.Id,
                numerZamowienia = select.NumerZewnetrzny,
                numerZk = select.NumerWewnetrzny.PelnaSygnatura,
                chcekd = false,
                data = select.DataWprowadzenia,
                waluta = select.Waluta.Symbol,
                kontrahent = new Zk.Kontrahent()
                {
                    nazwa = select.Podmiot.AdresPodstawowy.Nazwa,
                    nazwaSkrocona = select.Podmiot.NazwaSkrocona,
                    miejscowosc = select.Podmiot.AdresPodstawowy.Szczegoly.Miejscowosc,
                    kodPocztowy = select.Podmiot.AdresPodstawowy.Szczegoly.KodPocztowy,
                    nrDomu = select.Podmiot.AdresPodstawowy.Szczegoly.NrDomu,
                    nrLokalu = select.Podmiot.AdresPodstawowy.Szczegoly.NrLokalu,
                    ulica = select.Podmiot.AdresPodstawowy.Szczegoly.Ulica,
                    mail = select.Podmiot.Kontakty.Where(k => k.Podstawowy == true && k.Rodzaj.Id == rodzajeKontaktu).FirstOrDefault().Wartosc,
                    nip = select.Podmiot.NIP,
                    firma = select.Podmiot.Firma.Nazwa


                },
                kontrahentDostawa = new Zk.Kontrahent()
                {
                    nazwa = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.Adres.Nazwa,
                    miejscowosc = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.Miejscowosc,
                    kodPocztowy = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.KodPocztowy,
                    nrDomu = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.NrDomu,
                    nrLokalu = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.NrLokalu,
                    ulica = select.Podmiot.DomyslnyAdresDostaw.Szczegoly.Ulica,
                },
                produkty = select.Pozycje

                .Select(p => new Zk.Produkt()
                {
                    ilosc = p.Ilosc,
                    indeks = p.AsortymentAktualny.Symbol,
                    typ = p.RodzajAsortymentuId,
                    cena = p.Cena.BruttoPrzedRabatem,
                    rabat = p.Cena.RabatProcent,
                    vat = p.StawkaVat.Stawka,                         
                })



            })
            .ToList();


    zkBindingSource.DataSource = dataSource;

}

 

Link to postu

Dziękuje. Teraz wiadomo już znacznie więcej. Ilość zwracanych danych nie jest w tym przypadku aż tak istotna. Bardziej istotna jest sama forma tego zapytania oraz postać generowanego zapytania SQL. Przy pomocy profilera SQL można je podejrzeć. Widać wówczas, że wynikowy SQL zawiera 115 JOIN-ów. Stosując drobną optymalizację można zmniejszyć ilość JOIN-ów do 36 (warunek WHERE ze względu na brak interfejsu użytkownika jest nieco inny niż w Pani przykładzie)

zamowienia.Dane.Wszystkie()
                    .Where(x => x.DataWprowadzenia > new DateTime(2000, 5, 1) &&
                                x.DataWprowadzenia < new DateTime(2020, 12, 31) &&
                                (x.FlagaWlasna == null || x.FlagaWlasna.Id == 1230))
                    .Select(x => new
                    {
                        Dok = x,
                        Podmiot = x.Podmiot,
                        Adres = x.Podmiot.AdresPodstawowy.Szczegoly,
                        AdresDostaw = x.Podmiot.DomyslnyAdresDostaw.Szczegoly,
                    })
                    .Select(select => new Zk()
                    {
                        id = select.Dok.Id,
                        numerZamowienia = select.Dok.NumerZewnetrzny,
                        numerZk = select.Dok.NumerWewnetrzny.PelnaSygnatura,
                        chcekd = false,
                        data = select.Dok.DataWprowadzenia,
                        waluta = select.Dok.Waluta.Symbol,
                        kontrahent = new Zk.Kontrahent()
                        {
                            nazwa = select.Podmiot.AdresPodstawowy.Nazwa,
                            nazwaSkrocona = select.Podmiot.NazwaSkrocona,
                            miejscowosc = select.Adres.Miejscowosc,
                            kodPocztowy = select.Adres.KodPocztowy,
                            nrDomu = select.Adres.NrDomu,
                            nrLokalu = select.Adres.NrLokalu,
                            ulica = select.Adres.Ulica,
                            mail = select.Podmiot.Kontakty.Where(k => k.Podstawowy == true && k.Rodzaj.Id == rodzajeKontaktu).FirstOrDefault().Wartosc,
                            nip = select.Podmiot.NIP,
                            firma = select.Podmiot.Firma.Nazwa
                        },
                        kontrahentDostawa = new Zk.Kontrahent()
                        {
                            nazwa = select.AdresDostaw.Adres.Nazwa,
                            miejscowosc = select.AdresDostaw.Miejscowosc,
                            kodPocztowy = select.AdresDostaw.KodPocztowy,
                            nrDomu = select.AdresDostaw.NrDomu,
                            nrLokalu = select.AdresDostaw.NrLokalu,
                            ulica = select.AdresDostaw.Ulica,
                        },
                        produkty = select.Dok.Pozycje
                        .Select(p => new Zk.Produkt()
                        {
                            ilosc = p.Ilosc,
                            indeks = p.AsortymentAktualny.Symbol,
                            typ = p.RodzajAsortymentuId,
                            cena = p.Cena.BruttoPrzedRabatem,
                            rabat = p.Cena.RabatProcent,
                            vat = p.StawkaVat.Stawka,
                        })
                    })
                    .ToList()

 

Jednak najlepszą optymalizację można uzyskać zmieniając nieco formę zapytania. Wówczas ilość JOIN-ów zmniejsza się do 17.

(from z in zamowienia.Dane.Wszystkie()
                 let podmiot = z.Podmiot
                 let adres = podmiot.AdresPodstawowy
                 let adresSzczegoly = adres.Szczegoly
                 let adresDostaw = podmiot.DomyslnyAdresDostaw
                 let adresDostawSzczegoly = adresDostaw.Szczegoly
                 where  z.DataWprowadzenia > new DateTime(2000, 5, 1) &&
                        z.DataWprowadzenia < new DateTime(2020, 12, 31) &&
                        (z.FlagaWlasna == null || z.FlagaWlasna.Id == 1230)
                 select new Zk()
                 {
                     id = z.Id,
                     numerZamowienia = z.NumerZewnetrzny,
                     numerZk = z.NumerWewnetrzny.PelnaSygnatura,
                     chcekd = false,
                     data = z.DataWprowadzenia,
                     waluta = z.Waluta.Symbol,
                     kontrahent = new Zk.Kontrahent()
                     {
                         nazwa = adres.Nazwa,
                         nazwaSkrocona = podmiot.NazwaSkrocona,
                         miejscowosc = adresSzczegoly.Miejscowosc,
                         kodPocztowy = adresSzczegoly.KodPocztowy,
                         nrDomu = adresSzczegoly.NrDomu,
                         nrLokalu = adresSzczegoly.NrLokalu,
                         ulica = adresSzczegoly.Ulica,
                         mail = podmiot.Kontakty.Where(k => k.Podstawowy == true && k.Rodzaj.Id == rodzajeKontaktu).FirstOrDefault().Wartosc,
                         nip = podmiot.NIP,
                         firma = podmiot.Firma.Nazwa
                     },
                     kontrahentDostawa = new Zk.Kontrahent()
                     {
                         nazwa = adresDostaw.Nazwa,
                         miejscowosc = adresDostawSzczegoly.Miejscowosc,
                         kodPocztowy = adresDostawSzczegoly.KodPocztowy,
                         nrDomu = adresDostawSzczegoly.NrDomu,
                         nrLokalu = adresDostawSzczegoly.NrLokalu,
                         ulica = adresDostawSzczegoly.Ulica,
                     },
                     produkty = z.Pozycje
                         .Select(p => new Zk.Produkt()
                         {
                             ilosc = p.Ilosc,
                             indeks = p.AsortymentAktualny.Symbol,
                             typ = p.RodzajAsortymentuId,
                             cena = p.Cena.BruttoPrzedRabatem,
                             rabat = p.Cena.RabatProcent,
                             vat = p.StawkaVat.Stawka,
                         })
                 }).ToList()

 

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