Linq-to-SQL ToDictionary()
Comment convertir deux colonnes à partir de SQL (2008) à l'aide de Linq dans un Dictionnaire (pour la mise en cache)?
Je suis actuellement en boucle à travers le IQueryable b/c je ne peux pas obtenir le ToDictionary méthode de travail. Des idées?
Cela fonctionne:
var query = from p in db.Table
select p;
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (var p in query)
{
dic.Add(sub.Key, sub.Value);
}
Ce que j'aimerais vraiment faire est quelque chose de ce genre, qui ne semble pas fonctionner:
var dic = (from p in db.Table
select new {p.Key, p.Value })
.ToDictionary<string, string>(p => p.Key);
Mais j'obtiens cette erreur:
Impossible de convertir de 'Système.Linq.IQueryable' à 'Système.Les Collections.Génériques.IEnumerable'
Vous devez vous connecter pour publier un commentaire.
kvp => kvp.Value as string
. Le point de la réponse a été.AsEnumerable()
.AsEnumerable
nécessaire? Pour moi, il fonctionne sans que trop, mais probablement Linq a déjà changé (de 7 ans ont passé)AsEnumerable
était nécessaire. Je ne me souviens pas précisément pourquoi, après tout ce temps, mais une explication possible est queToDictionary
est une méthode d'extension surIEnumerable
, mais l'interface de Linq-to-SQL n'a pas étéIEnumerable
.Vous êtes seulement la définition de la clé, mais vous devez inclure la valeur:
<string, string>
part permet d'utiliser lepublic static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer);
surcharge au lieu de lapublic static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector);
de surcharge..AsEnumerable()
avant.ToDictionary()
Merci les gars, vos réponses m'ont aidé à résoudre ce problème, devrait être:
Pourquoi voulez-vous créer un objet anonyme pour chaque élément de la table, juste pour le convertir?
Vous pouvez simplement utiliser quelque chose comme:
IDictionary<string, string> dic = db.Table.ToDictionary(row => row.Key, row => row.Value);
Vous devrez peut-être inclure une AsEnumerable() appel entre la Table et le ToDictionary().
Je ne connais pas le type exact de la db.Table.
Également de corriger le premier échantillon, votre deuxième variable de boucle est désadaptation à la déclaration et à l'utilisation.
ToDictionary
est en mémoire. Ne pas créer un objet anonyme signifie que toutes les colonnes sont extraites de la base de données au lieu de seulement ceux dont vous avez besoin.ToDictionary
ne sais pas à propos de la structure sous-jacente, il se contente d'appeler les deux rappels pour une clé et une valeur (dans ce cas simple de la propriété sélection de lambda), de sorte que cetteToDictionary
appel doit être fonctionnellement équivalente à la foreach dans l'exemple qu'il a fourni. Autant que je sache, toutes les méthodes LINQ sont reportés, en signifiant que les rappels ne sont appelés, si nécessaire.