Comment puis-je définir les propriétés de tous les éléments à partir d'une requête linq avec des valeurs à partir d'un autre objet qui est également tiré à partir d'une requête?
J'ai une requête en tirant à partir d'une base de données:
List<myClass> items = new List<myClass>(from i in context
select new myClass
{
A = i.A,
B = "", //i doesn't know this, this comes from elsewhere
C = i.C
}
J'ai aussi une autre question à faire une chose semblable:
List<myClass2> otherItems = new List<myClass2>(from j in context
select new myClass2
{
A = j.A, //A is the intersection, there will only be 1 A here but many A's in items
B = j.B
}
En réalité, ces classes sont beaucoup plus grandes et des données de requête séparés non seulement par la base de données, mais par le serveur. Est-il possible d'utiliser une requête LINQ pour remplir la propriété B pour tous les items
où les éléments.Une intersection? Tous les construit dans LINQ prédicats n'apparaissent que pour faire des agrégats, des sélections ou des expressions bool.
Dans mon cerveau, j'ai eu quelque chose comme cela, mais c'est hors tout:
items.Where(x => x.B = (otherItems.Where(z => z.A == x.A).Single().B));
Ou suis-je ridicule à essayer de faire ce travail dans LINQ et devrait simplement l'abandonner en faveur d'une boucle où le paramètre réel devient trivial? Étant donné les délais, je vais recourir à la boucle for (et ça va probablement finir par être beaucoup plus lisible dans le long terme, de toute façon), mais est-il possible de faire cela? Serait une extension de la méthode nécessaire pour ajouter un prédicat pour permettre cela?
Pourriez-vous montrer un simple jeu de données qui a la structure principale que vous recherchez? Quelle est la dernière requête en essayant d'atteindre?
La deuxième requête contient les
B
variable. Je suis à la recherche d'un prédicat ou d'une méthode d'extension qui va effectuer la population de la B
variable dans la première collection.OriginalL'auteur Joel Etherton | 2011-10-21
Vous devez vous connecter pour publier un commentaire.
LINQ est conçu pour interrogation. Si vous essayez de ensemble choses, vous devriez certainement utiliser une boucle (probablement
foreach
). Cela ne signifie pas que vous ne serez pas en mesure d'utiliser LINQ dans le cadre de cette boucle, mais vous ne devriez pas être en train d'essayer d'appliquer un effet à l'intérieur de LINQ lui-même.Ils font partie des ajouts spécifiques des fournisseurs LINQ - ils ne font pas partie de LINQ lui-même. Chaque fournisseur LINQ est "la requête de la partie la suite de l'LINQ motif", en plus d'autres pièces qui sont spécifiques au fournisseur.
Je pense que quelque chose comme cela correspondrait à l'intérieur de LINQ to Objects, mais je peux comprendre pourquoi il n'est pas un défaut de mise en œuvre. Donc, à votre avis, si j'avais besoin de quelque chose comme ce qui pourrait justifier le coût de l'effort, il serait nécessaire (prudent?) pour mettre en place mes propres LINQ to MyNamespace fournisseur?
Il ne rentre pas dans LINQ to Objects parce que LINQ est conçu pour être fonctionnel, sans effets secondaires. Il va à l'encontre de l'ensemble de la philosophie de LINQ. Par tous les moyens d'écrire réutilisables méthodes pour les effets secondaires qui peuvent fonctionner avec LINQ, mais je ne voudrais pas essayer de les faire ressembler à des de LINQ.
OriginalL'auteur Jon Skeet
Requête de la OtherItems premier. Faire un ToDictionary() sur le résultat. Ensuite, lors de l'interrogation de la base de données, faites ceci:
La droite. Le local de la fermeture de l'habitude de traduire par l'expression de l'arbre dans la Requête LINQ fournisseur. Eh bien, cela dépend de la façon dont vous souhaitez que la requête à exécuter. Si vous souhaitez que la requête d'être paresseux évaluées, vous risquez de heurter à de nombreuses reprises lors de l'itération. Mais je suppose que vous pourriez le faire avec faire src.Select(remdata=>new{}).AsEnumerable().Select(localdata=>new{A=ld.a,B=otherItems[ld.a],C=ld.c})
OriginalL'auteur Tormod