La conversione di Query Linq Risultato Dizionario

Vorrei aggiungere alcune righe di un database utilizzando Linq to SQL, ma voglio fare un “controllo personalizzato” prima di aggiungere le righe per sapere se devo aggiungere, sostituire o ignorare le notifiche righe.
Mi piacerebbe mantenere il traffico tra il client e il server DB più basso possibile e ridurre al minimo il numero di query.

Per fare questo, voglio recuperare informazioni necessarie per la convalida, e solo una volta all’inizio del processo.

Stavo pensando di fare qualcosa di simile a questo, ma, ovviamente, non funziona. Qualcuno ha un’idea?

Dictionary<int, DateTime> existingItems = 
    (from ObjType ot in TableObj
        select (new KeyValuePair<int, DateTime>(ot.Key, ot.TimeStamp))
    )

Quello che mi piacerebbe avere, alla fine sarebbe un Dizionario, senza dover scaricare l’intero ObjectType oggetti da TableObject.

Ho anche considerato il seguente codice, ma stavo cercando di trovare un modo corretto:

List<int> keys = (from ObjType ot in TableObj orderby ot.Key select ot.Key).ToList<int>();
List<DateTime> values = (from ObjType ot in TableObj orderby ot.Key select ot.Value).ToList<int>();
Dictionary<int, DateTime> existingItems = new Dictionary<int, DateTime>(keys.Count);
for (int i = 0; i < keys.Count; i++)
{
    existingItems.Add(keys[i], values[i]);
}
InformationsquelleAutor Tipx | 2009-06-05



4 Replies
  1. 589

    Provare a utilizzare ToDictionary metodo in questo modo:

    var dict = TableObj.ToDictionary( t => t.Key, t => t.TimeStamp );
    • Che cosa è T qui???
    • è un segnaposto per ogni elemento dell’enumerazione e il tipo di oggetti nell’enumerazione.
    • tvanfosson mi potete spiegare uno. Io non sono in grado di Capire. Ora i miei capelli è quello di Convertire Un Linq to Dizionario. Problema è che il Valore è una Stringa (la creazione in LINQ) il formato e la chiave è p “””var serverUrl = (da p in elenco[i].ProjectName selezionare{ (“tcp://” + list[i].BuildMachineName + “:” + list[i].Numeroporta+ “/CruiseManager.rem”, p)}”””
    • che non guardare a destra. Mi sarei aspettato var servers = list.Select( s => new { s.ProjectName, Url = "tcp://" + s.BuildMachineName + ":" + s.PortNumber + "/CruiseManager.rem" } ).ToDictionary( s => s.ProjectName, s.Url ); Questo crea un dizionario la chiave dal nome del progetto nome del progetto/url coppie.
    • grazie, la tua risposta non era la mia soluzione, ma il lavoro mi piace rainin siccità… thanku
    • Perché il .Select( t => new { t.Key, t.TimeStamp } ) espressione necessaria?
    • Penso intermedio .Select cause SQL generato solo selezionare la Chiave e il TimeStamp, piuttosto che la selezione di ogni colonna.
    • È possibile omettere questo intermediario Select se si sta facendo Linq to Object (invece di Linq to SQL)

  2. 117

    Guardando il tuo esempio, credo che questo è ciò che si vuole:

    var dict = TableObj.ToDictionary(t => t.Key, t=> t.TimeStamp);
    • Wow… potrebbe essere semplice… Dato che io sono abbastanza nuovo per la programmazione, la proverò e fare un po ‘ di profilazione per assicurarsi che sotto il cofano, io non ottenere il colpo dell’intero oggetto. Io a tenervi sempre aggiornati.
    • Ho appena fatto il mio controllo. Purtroppo, mentre ottenere la TableObj, recupera tutti gli oggetti del db così finisco per ottenere il traffico colpito. Ho anche controllato le query che il secondo che ho postato (e che volevo evitare) e ottenere gli elementi necessari. Sicuro che ti fa 2 query in modo che il server stesso, sono alla ricerca di due volte le tabelle, ma l’oggetto di mappatura è abbastanza semplice.
    • Si potrebbe essere in grado di fare: TableObj.Selezionare(t => nuovo { t.Chiave, t.TimeStamp }).ToDictionary(t => t.Chiave, t => t.TimeStamp); LinqToSql dovrebbe essere in grado di avviso che si desidera solo due cose (da selezionare) e restituirli. Io non sono sicuro che sia abbastanza intelligente per scavare nelle specifiche di ToDictionary().
    • BELLO! Qui è il risultato di una query : SELECT [t0].[Key], [t0].[TimeStamp] DA [TableObj] COME [t0]. Non voglio prendere il merito per questo quindi, andare avanti e post che come risposta! 😛
    • Bello, semplice e funziona come un fascino!
  3. 7

    Provare le seguenti

    Dictionary<int, DateTime> existingItems = 
        (from ObjType ot in TableObj).ToDictionary(x => x.Key);

    O il completo tipo inferenced versione

    var existingItems = TableObj.ToDictionary(x => x.Key);
    • Grazie per la risposta JaredPar. Ho insegnato qualcosa di simile, ma penso che questo dovrebbe restituire tutti gli oggetti di ObjType tipo, e Iwant per evitare di dover scaricare l’intero oggetti.
    • si può fornire alcune informazioni su ciò che si desidera filtrare? L’aggiunta di una clausola di filtro è possibile, ma non capisco dalla tua domanda che cosa è importante
    • Io ho bisogno di sapere se la “nuova riga” devono essere aggiunti, essere ignorati o sostituire un’altra riga è il timestamp dell’oggetto. Gli oggetti del DB sono un sacco di campi non ho bisogno per la convalida e non voglio che per ottenere le prestazioni di ottenere tutti gli oggetti. Per mantenere le cose semplici, ho una tabella nel mio BD con 20 colonne, 100 000 righe e voglio estrarre un Dizionario utilizzando i valori delle prime 2 colonne.
    • Ho appena controllato il server query generate da tale codice e come probabilmente lo sapeva, si ottiene l’intera oggetti.
  4. 0

    Uso dello spazio dei nomi

    using System.Collections.Specialized;

    Fare istanza di DataContext Classe

    LinqToSqlDataContext dc = new LinqToSqlDataContext();

    Utilizzare

    OrderedDictionary dict = dc.TableName.ToDictionary(d => d.key, d => d.value);

    Per recuperare i valori di uso dello spazio dei nomi

       using System.Collections;
    
    ICollection keyCollections = dict.Keys;
    ICOllection valueCollections = dict.Values;
    
    String[] myKeys = new String[dict.Count];
    String[] myValues = new String[dict.Count];
    
    keyCollections.CopyTo(myKeys,0);
    valueCollections.CopyTo(myValues,0);
    
    for(int i=0; i<dict.Count; i++)
    {
    Console.WriteLine("Key: " + myKeys[i] + "Value: " + myValues[i]);
    }
    Console.ReadKey();
    • Per Multilple tasti ?

Lascia un commento