将2个Linq查询合并为1个

时间:2010-05-10 20:30:05

标签: linq linq-to-sql

鉴于以下信息,我如何将这两个linq查询合并为1.在join语句中遇到一些麻烦。

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

2 个答案:

答案 0 :(得分:3)

我不认为迈克的建议会在这里奏效。这两个查询是完全不同的,将它们组合成一个查询只会使它更难阅读。

  • 对象有不同的类型。
  • where子句不同。
  • group by子句不同:
    • new { c.ProjectDetail, c.ProgramFund }
    • new { c.ProjectDetails, c.ProgramFunds }
  • 选择条款不同。

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

答案 1 :(得分:2)

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

pCardAccount.Concat(expenditures).ToArray()

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

编辑:我刚注意到每个查询中的密钥都不同。我不确定这是否是一个错字,但如果不是,你将无法通过不同的类型连接它们,无论如何它都没有任何意义