Convertir el resultado de la consulta Linq en un diccionario
Quiero agregar algunas filas a una base de datos usando Linq to SQL, pero quiero hacer una "verificación personalizada" antes de agregar las filas para saber si debo agregar, reemplazar o ignorar las filas entrantes. Me gustaría mantener el tráfico entre el cliente y el servidor de base de datos lo más bajo posible y minimizar la cantidad de consultas.
Para hacer esto, quiero obtener la menor cantidad de información necesaria para la validación, y solo una vez al comienzo del proceso.
Estaba pensando en hacer algo como esto, pero obviamente no funciona. ¿Alguien tiene una idea?
Dictionary<int, DateTime> existingItems =
(from ObjType ot in TableObj
select (new KeyValuePair<int, DateTime>(ot.Key, ot.TimeStamp))
)
Lo que me gustaría tener al final sería un Diccionario, sin tener que descargar todos los objetos ObjectType de TableObject.
También consideré el siguiente código, pero estaba tratando de encontrar una forma adecuada:
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]);
}
Intente usar el ToDictionary
método así:
var dict = TableObj.Select( t => new { t.Key, t.TimeStamp } )
.ToDictionary( t => t.Key, t => t.TimeStamp );
Mirando tu ejemplo, creo que esto es lo que quieres:
var dict = TableObj.ToDictionary(t => t.Key, t=> t.TimeStamp);
Prueba lo siguiente
Dictionary<int, DateTime> existingItems =
(from ObjType ot in TableObj).ToDictionary(x => x.Key);
O la versión completa con inferencia de tipo
var existingItems = TableObj.ToDictionary(x => x.Key);
Usar espacio de nombres
using System.Collections.Specialized;
Hacer instancia de DataContext
clase
LinqToSqlDataContext dc = new LinqToSqlDataContext();
Usar
OrderedDictionary dict = dc.TableName.ToDictionary(d => d.key, d => d.value);
Para recuperar los valores utilice el espacio de nombres.
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();