2010-11-27 4 views
0

Je veux convertir cette requête LINQ à utiliser avec Entity Framework 4.requête SQL à LINQ

Select *, 
(select SUM(Of_Orders.Contribution) from Of_Orders 
where Of_Orders.CauseID = Of_Causes.CauseID) AS Earned 
FROM Of_Causes 

Quelqu'un peut-il me aider à le faire.

Merci à l'avance

Répondre

1

Il se refroidit comme le champ CauseID représente une clé étrangère? Si c'est le cas, vous pouvez mapper une association dans votre modèle d'entité, de sorte que cause.Orders est une propriété à laquelle vous pouvez accéder. Côté note, vous pouvez également renommer les entités/propriétés, ils n'ont pas à faire correspondre les noms des tables afin que vous puissiez vous débarrasser des underscores laids! Cela ressemblerait alors à ceci:

var result = from c in context.Of_Causes 
select new {cause, cause.Orders.Sum(o => o.Contribution} 

Vous obtiendrez quelques avantages de le faire (si vous le pouvez), comme un modèle plus propre et plus efficace des requêtes SQL généré.

Si vous ne pouvez pas utiliser une clé étrangère, je joindrais manuellement les tables, ce qui devrait améliorer les performances.

Je crois que cela ressemble à ça, mais ma traduction de VB à C# peut être douteux, voici le C#:

var context = new ModelContainer(); 
var result = from c in context.Of_Cause 
      join o in context.Of_Orders on c.Id equals o.CauseID into g 
      select new {Cause = c, Total = g.Sum(o => o.Contribution)}; 

Et voici l'original VB dans le cas où ma traduction est désactivé!

Dim result = From cause As Of_Cause In context.Of_Cause 
      Group Join order As Of_Orders In context.Of_Orders On order.CauseID Equals cause.Id Into total = Sum(order.Contribution) 
      Select New With {.Cause = cause, .Total = total} 
+0

Salut, c'est une explication cool. Pouvez-vous m'aider avec plus de choses à chaque fois que nous faisons "sélectionnez nouveau", il crée un type anonyme. Je veux créer une liste de type Cause et veux stocker le total dans une propriété de l'objet Cause comment dois-je faire cela? –

+0

Oui, pas de problème, mais pourriez-vous le poser comme une nouvelle question? Ne peut pas facilement faire beaucoup dans une boîte de commentaires autre que le commentaire car il n'y a pas de code, etc. – RichardW1001

1

Ce serait quelque chose de similaire à:

from cause in context.Of_Causes 
select new { 
    cause, 
    Earned = context.Of_Orders.Where(o => o.CauseID == cause.CauseID).Sum(o => o.Contribution) 
}; 

J'ai fait quelques hypothèses sur les types impliqués, mais cela devrait être facile pour vous de travailler sur.

+0

C'est ce que j'ai déjà fait mais le "select new" crée un type anonyme mais je veux créer un type de liste de causes. –