2011-03-02 2 views
0

J'ai 2 tables, OrderDetails et Requests Dans mon fichier dbml LINQ to SQL. OrderDetailsID est une clé étrangère dans la table Requests.Sélectionner une requête dans LINQ basé sur Foreign Table

Je veux écrire la requête pour obtenir la somme de UnitCost de OrderDetails basé sur OrderId. Et s'il y a une ligne dans la table des demandes pour chaque OrderDetailsID, et le Requests.Last.RequestType = "Remboursement" Je veux réduire le montant total du remboursement de la somme principale Sinon, s'il n'y a pas de ligne basée sur OrderDetailsID, ajouter à la somme .

Voici comment je l'implémente. Je cherche à éviter d'utiliser "Pour chaque".

Des solutions?

iRefund = (From od1 In dc.OrderDetails _ 
      Where od1.OrderID =1 _ 
      Select od1.UnitCost).Sum 

Dim objOrderDetails = (From od1 In dc.OrderDetails _ 
         Where od1.OrderID =1 _ 
         Select od1) 

For Each OrderDetail As ORM.Entities.OrderDetail In objOrderDetails 
    If Not OrderDetail.Requests Is Nothing Then 
     IF OrderDetail.Requests.Last.RequestType="Refund" Then 
        iRefund -= OrderDetail.UnitCost 
     End If 
    End If 
    Next 

Répondre

1

Si vous souhaitez utiliser LINQ au lieu d'un pour-chaque boucle, vous pouvez utiliser la méthode d'extension ForEach de la liste:

Dim objOrderDetails = (From od1 In dc.OrderDetails _ 
         Where od1.OrderId = 1 _ 
         Select od1).ToList() 

objOrderDetails.ForEach(AddressOf DecrementAmount) 

Private Sub DecrementAmount(ByVal d As OrderDetail) 
    If d.Requests IsNot Nothing _ 
     AndAlso d.Requests.Count > 0 _ 
     AndAlso d.Requests.Last.RequestType = "Refund" Then 
     iRefund -= d.UnitCost 
    End If 
End Sub 

Cela suppose que iRefund est variable de module.

+0

Je suis impatient de découvrir S'il existe une solution pour fusionner la requête select et ForEach et obtenir le résultat en utilisant une requête LINQ. Mais merci pour votre réponse. C'était utile. – arlen

+0

Que voulez-vous dire par fusionner? Vous pouvez chaîner les deux instructions et ainsi ignorer la déclaration objOrderDetails, mais vous ne pouvez pas supprimer ToList() car ForEach() n'est pas disponible sur IQueryable ou même IEnumerable. – Antony

Questions connexes