442 messaggi dal 09 marzo 2006
grande, hai capito e sei stato piu che esaustivo grazie.
442 messaggi dal 09 marzo 2006
solo un ultima cosa informativa.
Se volessi estrarre tutti i wall o i beam posso usare linq to object? ho settato il parametro nell xsd ma non conoscendolo te lo chiedo soprattutto se è possibile me lo studio altrimenti passo oltre.
Hai due link o due parole se fosse possibile?
grazie molte.
ciao.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Giuseppe,
sì, se intendi estrarre dei nodi in base ad un criterio particolare, puoi caricare l'intero documento XML con la classe XmlDocument e fare query con il suo metodo SelectNodes con il linguaggio XPath.
In alternativa, puoi usare la più recente classe XDocument di Linq to XML, che è simile nel funzionamento ad XmlDocument ma ti permette anche di fare query LINQ ed eventualmente di proiettare i nodi XML trovati sulle relative classi C#.
Qui trovi un'introduzione di Stefano Mostarda a Linq to XML.
http://media.aspitalia.com/screencast/LINQ-to-XML-introduzione.media

Attenzione però perché se ti trovi a lavorare con documenti XML giganteschi potresti non avere prestazioni ottimali (infatti, l'intero documento deve essere caricato in memoria prima che li si possa interrogare o con XPath o con LINQ).
In questo caso si va di XmlReader che legge il file sequenzialmente (ma è anche più fastidioso lavorarci perché non ti permette di fare queries).

ciao,
Moreno

Enjoy learning and just keep making
442 messaggi dal 09 marzo 2006
scusa se mi permetto , ma io intendevo fare query sugli oggetti in memoria dopo una deserializzazione che li ha caricati.
Se deserializzo ho un insieme di classi generate dall'xsd, popolate con valori , ecco posso fare query su queste entità con linq?
Grazie.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Giuseppe,
sì, certo. Se hai una o più liste di entità in memoria puoi usare Linq to Objects per filtrarle.

Enjoy learning and just keep making
442 messaggi dal 09 marzo 2006
riagganciandomi ai post precedenti ho questo codice:




using (TransactionScope scope = new TransactionScope())
            {
                DbIfc context = null;
                try
                {
                    context = new DbIfc();
                    context.Configuration.AutoDetectChangesEnabled = false;
                    context.Configuration.ValidateOnSaveEnabled = false;

                    int count = 0;
                    
                        context.Set<iso_10303>().Add(entity);
            context.SaveChanges();
                    
                   
                }
                finally
                {
                    if (context != null)
                        context.Dispose();
                }

                scope.Complete();
            }


dove entity è l'entità corretta da aggiungere.
be ci mette 4 ore e alla fine mi da un errore criptico dopo lo posto sta andando, ho due istanze di sql express una sql server 12 e una sqlserver express.
è possibile che ci metta cosi tanto ? ho letto che il primo inserimento crea il db ma 4 ore? ci deve essere qualcosa che non va dove sbaglio?Non ho configurato nessuna connection string perchè ho letto che se trova un istanza di sqlserver express usa quella , ho capito bene?
grazie ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Giuseppe, bentrovato.

ho letto che il primo inserimento crea il db ma 4 ore?

Mi sembra un'enormità di tempo ma tutto dipende da quante entità devi inserire e dal codice che stai usando.
La fase di creazione del database è molto rapida quindi non dipende sicuramente da quella.

Nel codice che hai postato non vedo il ciclo for. Per caso si trova all'esterno di quel blocco?
Se sì, c'è qualche ottimizzazione da fare, perché è inutile creare una transazione e un DbContext per aggiungere una sola entità alla volta.

Secondo me dovresti usare questa libreria, che puoi scaricare da NuGet (in questa pagina sono descritti i comandi da lanciare nel riquadro di installazione pacchetti di visual studio).
https://efbulkinsert.codeplex.com/
Ti permetterà di fare il bulk insert delle tue entità, ovvero un inserimento massivo riducendo al minimo l'attesa.

Nella pagina trovi anche un esempio di utilizzo. In questo caso non è necessario alcun ciclo for perché il metodo BulkInsert prende direttamente una collezione di entità (poi ci pensa lui a ciclarle in maniera opportuna). Adattato al tuo caso diventa:
using (var ctx = new DbIfc())
{
  using (var transactionScope = new TransactionScope())
  {
    //entities è la tua collezione di entità
    ctx.BulkInsert(entities);

    ctx.SaveChanges();
    transactionScope.Complete();
  }
}



ho letto che se trova un istanza di sqlserver express usa quella , ho capito bene?

Sì, ma ti conviene essere esplicito e definire una connectionstring nel web.config chiamata come il tuo DbContext. Tanto è una cosa che dovrai fare comunque quando metterai l'applicazione in produzione.
<connectionStrings>
  <add name="DbIfc" connectionString="..." provider="System.Data.SqlClient" />
</connectionStrings>


Se non conosci il nome delle istanze di SqlExpress che sono installate sul tuo PC, puoi visualizzarle dal pannello "Sql Server Object Explorer" di Visual Studio.

ciao,
Moreno
Modificato da BrightSoul il 02 gennaio 2016 17.06 -

Enjoy learning and just keep making
442 messaggi dal 09 marzo 2006
grazie, sempre disponibile anche il 2 di gennaio,ciao auguri

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.