Je rencontre des problèmes avec une requête écrite en LINQ et Lambda. Jusqu'à présent, je reçois beaucoup d'erreurs, voici mon code:
int id = 1;
var query = database.Posts.Join(database.Post_Metas,
post => database.Posts.Where(x => x.ID == id),
meta => database.Post_Metas.Where(x => x.Post_ID == id),
(post, meta) => new { Post = post, Meta = meta });
Je suis nouveau dans l'utilisation de LINQ, donc je ne sais pas si cette requête est correcte.
Réponses:
Je trouve que si vous connaissez la syntaxe SQL, l'utilisation de la syntaxe de requête LINQ est beaucoup plus claire, plus naturelle et facilite la détection des erreurs:
Si vous êtes vraiment coincé à utiliser des lambdas, votre syntaxe est un peu différente. Voici la même requête, en utilisant les méthodes d'extension LINQ:
la source
lambda
et une citation facile à utiliser et à comprendreVous pouvez aller de deux façons avec cela. En utilisant LINQPad (inestimable si vous êtes nouveau sur LINQ) et une base de données factice, j'ai construit les requêtes suivantes:
ou
Dans ce cas particulier, je pense que la syntaxe LINQ est plus propre (je change entre les deux en fonction de ce qui est le plus facile à lire).
La chose que je voudrais souligner cependant, c'est que si vous avez des clés étrangères appropriées dans votre base de données (entre post et post_meta), vous n'avez probablement pas besoin d'une jointure explicite, sauf si vous essayez de charger un grand nombre d'enregistrements . Votre exemple semble indiquer que vous essayez de charger une seule publication et que ce sont des métadonnées. En supposant qu'il existe de nombreux enregistrements post_meta pour chaque publication, vous pouvez effectuer les opérations suivantes:
Si vous voulez éviter le problème n + 1, vous pouvez explicitement dire à LINQ to SQL de charger tous les éléments associés en une seule fois (bien que cela puisse être un sujet avancé lorsque vous êtes plus familier avec L2S). L'exemple ci-dessous dit "lorsque vous chargez une publication, chargez également tous ses enregistrements qui lui sont associés via la clé étrangère représentée par la propriété 'Post_metas'":
Il est possible de faire de nombreux
LoadWith
appels sur un même ensemble deDataLoadOptions
pour le même type, ou de nombreux types différents. Si vous faites cela cependant, vous voudrez peut-être simplement envisager la mise en cache.la source
Daniel a une bonne explication des relations syntaxiques, mais j'ai rassemblé ce document pour mon équipe afin de le rendre un peu plus simple à comprendre. J'espère que cela aide quelqu'un
la source
Post_ID
champ dans le deuxième aliasmeta => meta.Post_ID
. Dans l'exemple de cette illustration, lag.id
partie de l'instruction select d'origineJOIN gStatus g on g.id
n'est pas répliquée dans l'expression Lambda finale.public class IdHolder{ int id }
puis utilisé cet objet dans le gStatus,List<IdHolder> gStatus = new List<IdHolder>(); gStatus.add(new IdHolder(){id = 7}); gStatus.add(new IdHolder(){id = 8});
il aurait changé le Linq pourt =>t.value.TaskStatusId, g=>g.id
que ce changement soit-il logique?Vos sélecteurs de clés sont incorrects. Ils doivent prendre un objet du type de la table en question et retourner la clé à utiliser dans la jointure. Je pense que vous voulez dire ceci:
Vous pouvez appliquer la clause where par la suite, pas dans le cadre du sélecteur de clé.
la source
Publier parce que quand j'ai commencé LINQ + EntityFramework, j'ai regardé ces exemples pendant une journée.
Si vous utilisez EntityFramework et que vous avez une propriété de navigation nommée
Meta
dans laPost
configuration de votre objet modèle, c'est très simple. Si vous utilisez une entité et n'avez pas cette propriété de navigation, qu'attendez-vous?Si vous faites d'abord du code, vous devez configurer la propriété comme suit:
la source
J'ai fait quelque chose comme ça;
la source
Cela pourrait être quelque chose comme
la source
1 est égal à 1 deux jointures de table différentes
la source
Cette requête linq devrait fonctionner pour vous. Il obtiendra tous les messages contenant des méta-messages.
Requête SQL équivalente
la source