Utilisation du mot clé «let» dans une requête LINQ avec EF 4.3

J’ai un problème LINQ simple que je ne peux pas comprendre. J’ai une table Users et une table Employees . Un utilisateur peut avoir 0 … n employés.

J’aimerais faire quelque chose comme ça:

 var result = from u in context.users where u.UsrId = 2 let e = u.Employees.First() select new { UserId = u.UsrId, FirstName = e.FirstName }; 

Cela ne fonctionne évidemment pas car le First() appel First() est illégal. First () ne peut venir qu’à la fin d’une select . Ce qui n’a pas non plus fonctionné est de sélectionner l’employé dans une requête précédente comme ceci:

 var employee = from e. in context.Employees..... 

… puis dites: let e = employee au lieu de let e = u.Employees().First()

Je ne suis pas sûr si l’utilisation de laisser corriger. Je pensais que c’était pour les sous-requêtes.

La raison de l’appel First() est que la table Employees ne doit pas comporter plus d’une entrée pour chaque utilisateur. C’est une erreur dans la conception et je dois y faire face maintenant. Donc, je veux juste le premier.

 var result = from u in context.users let e = u.Employees.FirstOrDefault(x => x.bossId == u.UsrId) where u.UsrId = 2 select new { UserId = u.UsrId, FirstName = e.FirstName }; 

Juste un conseil sans test.

First peut être utilisé sauf au milieu d’une instruction LINQ interrogeable; lors de la traduction de cette instruction en SQL, il n’y a aucun moyen de constituer une première, son comportement étant de générer une erreur. FirstOrDefault peut cependant être traduit en Top (1), ce qui explique comment il a été transformé en SQL. Cela signifie que l’utilisation de la première au milieu d’une instruction SQL traduisible n’est pas vraiment valide, mais je pense qu’ils l’ont autorisée comme dernière instruction car un résultat nul peut être traduit en une exécution après requête.