2010-05-10 89 views
1

给出以下信息,如何将这2个linq查询合并为1。加入连接语句有点麻烦。将2个Linq查询合并到1中

“projectDetails”只是一个ProjectDetails的
ProjectDetails(1对多)名单PCardAuthorizations
ProjectDetails(1对多)ExpenditureDetails

通知我被同样的信息分组,并选择同一类型的信息

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) 
        }; 

回答

3

我不认为迈克的建议将在这里工作。这两个查询有很大的不同,将它们组合成一个查询会使读起来更加困难。

  • 对象有不同的类型。
  • where子句是不同的。
  • GROUP BY子句是不同的:
    • new { c.ProjectDetail, c.ProgramFund }
    • new { c.ProjectDetails, c.ProgramFunds }
  • 的选择子句是不同的。

实际上并没有什么是相同的。我建议保持原样。

2

在评估它们之前,你总是可以将它们连接在一起。

pCardAccount.Concat(expenditures).ToArray() 

应该生成一个带有联合的单个sql语句。至于在你的情况下是否有任何好处,我不知道。 linq-to-sql也有可能无法为concat生成SQL,并且无论何时使用它都会抛出异常。我不确定是什么原因造成的,但当我在类似的情况下玩时,我已经看过几次。

编辑:我只注意到你的密钥在每个查询中都是不同的。我不确定这是否是一个错字,但如果不是这样,但由于类型不同,您将无法将它们连接起来,因此无论如何也无济于事。