locked
LoadOperation RRS feed

  • Domanda

  • Ciao a tutti,

    (Silverlight5/ASP.NET, EF5, RiaService4.2)

    Sto provando a fare il tra il trasferimento dati da Entity a DTO, ho provato con questo codice:

            public ObservableCollection<UserDto> GetUsers()
            {
                ObservableCollection<UserDto> ListUsers = new ObservableCollection<UserDto>();
                UserDomainContext ctx = new UserDomainContext();
                EntityQuery<User> query = ctx.GetUsersQuery();
                LoadOperation<User> loadOp = ctx.Load(query);
    
                foreach (User c in loadOp.Entities)
                {
                    ListUsers.Add(new UserDto() { FirstName = c.FirstName, LastName = c.LastName });
                }
                return ListUsers;
            }
    

    this.dataGrid.ItemsSource = UserViewModel.GetUsers();

    ma non restituisce niente, 

    in foreach  invece che loadOp.Entities ho provato anche con ctx.Users ma e lo stesso

    anche il select non riesco a farlo funzionare...

                var user = (from c in loadOp.Entities where c.LastName == "Fabio" select c).SingleOrDefault();
                DataContext = user;
    

    qualcuno saprebbe dirmi come impostare correttamente i due codici ?

    grazie a tutti


    fabio miceli

    sabato 30 novembre 2013 15:19

Risposte

  • Ciao Fabio,

    è un operazione asincrona, quindi nel momento che fai il ciclo è probabile che ancora non hai ricevuto gli elementi, e siccome non lo hai direttamente impostato come itemsource del controllo (loadOp.Entities), non avverrà la notifica al controllo che la lista è cambiata. Se non lo imposti come ItemSource di un datagrid o comunque su un tipo che lavora con INotifyPropertyChanged, anche quando saranno caricati gli elementi non li vedrai a video comunque.


    • Modificato U 235 sabato 30 novembre 2013 15:30
    • Contrassegnato come risposta Fabio Miceli sabato 30 novembre 2013 21:18
    sabato 30 novembre 2013 15:28

Tutte le risposte

  • Ciao Fabio,

    è un operazione asincrona, quindi nel momento che fai il ciclo è probabile che ancora non hai ricevuto gli elementi, e siccome non lo hai direttamente impostato come itemsource del controllo (loadOp.Entities), non avverrà la notifica al controllo che la lista è cambiata. Se non lo imposti come ItemSource di un datagrid o comunque su un tipo che lavora con INotifyPropertyChanged, anche quando saranno caricati gli elementi non li vedrai a video comunque.


    • Modificato U 235 sabato 30 novembre 2013 15:30
    • Contrassegnato come risposta Fabio Miceli sabato 30 novembre 2013 21:18
    sabato 30 novembre 2013 15:28
  • ho risolto in questo modo:

                ctx.Load<User>(ctx.GetUsersQuery()).Completed += (s, e) =>
                {
                    ObservableCollection<UserDto> ListUsers = new ObservableCollection<UserDto>();
                    foreach (User c in ctx.Users)
                    {
                        ListUsers.Add(new UserDto() { FirstName = c.FirstName, LastName = c.LastName });
                    }
                    lbUsers.ItemsSource = ListUsers;
                    var us = (from c in ctx.Users where c.FirstName == "Fabio" select c).SingleOrDefault();
                    DataContext = us;
                };
    

    probabilmente, come dicevi tu, poichè è asincrono mettendo il codice all' nterno dell'evento Completed funziona.

    grazie alla prossima


    fabio miceli

    sabato 30 novembre 2013 18:57
  • Ciao Fabio,

    si, quando chiami i metodi del ria lo fai in maniera asincrona, quindi è necessario chiamare eventuali "lavorazioni" tramite l'evento Completed. Il codice precedente (come quello dell'altra discussione) funzionava perché impostavi direttamente Entities come itemsource, quindi quando i dati erano disponibili veniva richiamata la notifica di cambio valore.

    sabato 30 novembre 2013 21:42