2010-05-10 7 views
1

Étant donné les informations suivantes, comment puis-je combiner ces 2 requêtes linq en 1. J'ai un peu de problème avec l'instruction join.Combinaison de 2 requêtes Linq dans 1

'projectDetails' est juste une liste de ProjectDetails
ProjectDetails (1 à plusieurs) PCardAuthorizations
ProjectDetails (1 à plusieurs) ExpenditureDetails

Avis je groupe par les mêmes informations et en sélectionnant le même type d'informations

var pCardAccount = from c in PCardAuthorizations 
        where projectDetails.Contains(c.ProjectDetail) 
         && c.RequestStatusId == 2 
        group c by new { c.ProjectDetail, c.ProgramFund } into g 

        select new { Key = g.Key, Sum = g.Sum(x => x.Amount) }; 



var expenditures = from d in ExpenditureDetails 
        where projectDetails.Contains(d.ProjectDetails) 
         && d.Expenditures.ExpenditureTypeEnum == 0 
        group d by new { d.ProjectDetails, d.ProgramFunds } into g 
        select new { 
         Key = g.Key, 
         Sum = g.Sum(y => y.ExpenditureAmounts.FirstOrDefault(a => a.IsCurrent && !a.RequiresAudit).CommittedMonthlyRecords.ProjectedEac) 
        }; 

Répondre

3

Je ne pense pas que la suggestion de Mike fonctionnera ici. Ces deux requêtes sont suffisamment différentes pour les combiner en une seule requête, ce qui rendra la lecture plus difficile.

  • Les objets ont différents types.
  • Les clauses where sont différentes.
  • La clause GROUP BY est différent:
    • new { c.ProjectDetail, c.ProgramFund }
    • new { c.ProjectDetails, c.ProgramFunds }
  • Les clauses SELECT sont différentes.

En fait, il n'y a pas vraiment quelque chose qui soit identique. Je recommande de le laisser tel quel.

2

Vous pouvez toujours les concaténer ensemble avant de les évaluer.

pCardAccount.Concat(expenditures).ToArray() 

doit générer une instruction SQL unique avec une union. Quant à savoir s'il y a un avantage à cela dans votre situation, je ne sais pas. Il y a aussi une chance que linq-to-sql ne soit pas capable de générer le SQL pour la concatation et lancera une exception chaque fois que vous l'utiliserez. Je ne suis pas sûr de ce qui le cause, mais je l'ai vu à quelques reprises quand je jouais dans une situation similaire. Edit: Je viens de remarquer que vos clés sont différentes dans chacune des requêtes. Je ne sais pas si c'est une faute de frappe ou non, mais si ce n'est pas le cas, vous ne pourrez pas les concaténer à cause des différents types et cela n'aurait aucun sens de toute façon.