3 votes

Utilisation correcte de Select() et Where() dans une seule instruction

J'essaie d'écrire une requête dans le contrôleur similaire à ce que j'ai dans ma procédure stockée SQL :

Select * FROM TableName Where aDate >= beginDate and aDate <= endDate

Dans mon contrôleur, j'ai déclaré 2 variables, qui recevront les valeurs d'entrée de mon fichier de vue :

DateTime? startDate = input.BeginDateInput;
DateTime? endDate = input.EndDateInput;

et la variable q qui prend les valeurs de db

var q = db.tblName.AsQueryable();

Actuellement, j'ai un tableau de toutes les valeurs basé sur la sélection, qui ressemble à ce qui suit :

var data = q.Select(
  p =>
   new
   {
       //...
       WarrantyExpDate = p.WarrantyExpDate.ToShortDateString(),
       //...
   });

Lorsque j'ai essayé d'ajouter .Where() à la fin de la fonction

Select(...).Where(DateTime.Compare(Convert.ToDateTime(WarrantyExpDate), (DateTime)startDate)>0)

(raccourcir pour gagner du temps), je recevais une erreur WarrantyExpDate was not in the current context . Après avoir effectué quelques recherches, j'ai essayé de recréer la suggestion de ce fil pour échanger la sélection et l'emplacement, mais ça retournait le même problème.

Quelqu'un peut-il m'indiquer ce que je fais mal ? Comment faire pour que Select et Where reconnaissent la même variable ?

3voto

StriplingWarrior Points 56276

Comme le souligne BJ, si vous utilisez la syntaxe lambda, vous devez fournir une expression lambda à la méthode Where. Quelque chose comme ceci fonctionnera probablement :

var data = q
 .Where(p => p.WarrantyExpDate < startDate)
 .Select(
  p =>
   new
   {
       //...
       WarrantyExpDate = p.WarrantyExpDate.ToShortDateString(),
       //...
   });

Notez que je mets le Where clause en premier lieu. Cela vous permet d'exécuter la requête sur les données d'origine, plutôt que de les convertir en chaîne de caractères et inversement. C'est souvent, mais pas toujours, plus souhaitable. Parfois, votre Select effectue un travail important pour obtenir un élément d'information spécifique et vous ne voulez pas avoir à répéter cette logique dans la clause Where. L'avantage de LINQ est que vous pouvez choisir ce qui est le plus facile.

Vous pouvez également envisager d'utiliser la syntaxe de requête à la place ; cela revient à peu près au même, mais c'est un peu plus joli lorsque vous avez de grosses requêtes.

var data = 
  from p in q
  where p.WarrantyExpDate < startDate
  select new
  {
   //...
   WarrantyExpDate = p.WarrantyExpDate.ToShortDateString(),
   //...
  };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X