0 votes

Clause Where dans LINQ - C#

J'ai ce qui suit et qui fonctionne dans Analyseur de requêtes SQL .

select oh.*
from order_history oh
join orders o on o.order_id = oh.order_id
where oh.order_id = 20119 and oh.date_inserted = (
    select max(date_inserted) from order_history where order_id = oh.order_id
    group by order_id
)

Comment dois-je procéder pour me convertir à LINQ ? A partir du code de test, le compilateur s'est plaint :

Erreur L'opérateur '&&' ne peut pas être appliqué aux opérandes de type 'int' et 'System.DateTime'

Mon code LINQ :

var query = from ch in cdo.order_histories
    join c in cdo.orders on ch.order_id equals c.order_id
    where (ch.order_id.equals(1234)) &&
    (ch.date_inserted == (cdo.order_histories.Max(p => p.date_inserted)))
    select new OrderData() { };

Mise à jour : je n'ai pas utilisé '==' pour la comparaison.

L'élément restant est celui de ma requête SQL :

oh.date_inserted = (
select max(date_inserted) from order_history where order_id = oh.order_id
group by order_id)

Comment faire cela avec LINQ ?

5voto

casperOne Points 49736

Il semble qu'il manque un signe égal quelque part lors du filtrage sur le fichier order_id champ. Vous avez probablement :

oh.order_id = 20119 && ...

Considérant que vous devrait ont :

oh.order_id == 20119 && ...

Notez l'opérateur d'égalité par rapport à l'opérateur d'affectation. Le résultat d'un opérateur d'affectation est la valeur qui a été affectée, ce qui explique pourquoi votre erreur indique que vous ne pouvez pas comparer les opérandes int et System.DateTime.

Je suppose également que vous avez le même problème en ce qui concerne la vérification de la valeur de date_inserted également.

Pour la deuxième partie de votre question, vous êtes proche de la conversion de la sous-requête corrélée.

En SQL, vous avez :

oh.date_inserted = (
select max(date_inserted) from order_history where order_id = oh.order_id 
group by order_id)

Et dans LINQ-to-SQL, vous avez

ch.date_inserted == (cdo.order_histories.Max(p => p.date_inserted))

Il suffit d'ajouter le filtre pour le order_histories qui tire parti des fermetures pour capturer le order_id sur la page ch comme suit :

ch.date_inserted == (cdo.order_histories.
    Where(ch2 => ch2.order_id == ch.order_id).
    Max(p => p.date_inserted))

1voto

David B Points 53123

Vous pouvez traduire le SQL en LINQ... ou vous pouvez écrire le LINQ pour ce que vous voulez.

var result = cdo.order_histories
  .Where(oh => oh.order_id == 20119)
  .OrderByDescending(oh => oh.date_inserted)
  .Take(1)
  .Select(oh => new {history = oh, order = oh.order}
  .Single();

0voto

Josh Wolf Points 158

Je suis d'accord, un peu de code C# est nécessaire ici, mais je pense que vous utilisez "==" (évaluation) plutôt que "=" (affectation), n'est-ce pas ? C# fait une distinction ici, alors que SQL ne le fait pas.

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