将两个linq查询重构为一个查询

将两个linq查询重构为一个查询,linq,Linq,我有一个包含两个linq语句的方法,它们只有一个区别。一个查询按3个参数分组,另一个仅按2个参数分组。我确信有更好的方法将这两个linq查询重构为一个,但不确定如何重构 public List<ReportEntry> GetReportData(DateTime startDate, DateTime endDate, int companyId, bool groupByVATandPatAcc) { var results =

我有一个包含两个linq语句的方法,它们只有一个区别。一个查询按3个参数分组,另一个仅按2个参数分组。我确信有更好的方法将这两个linq查询重构为一个,但不确定如何重构

 public List<ReportEntry> GetReportData(DateTime startDate, DateTime endDate, int companyId, bool groupByVATandPatAcc)
    {
        var results =
            from cy in _dc.Companies
            join cyv in _dc.CompanyVersions on cy.CompanyId equals cyv.CompanyId
            join cyd in _dc.CompanyDetails on cyv.CompanyVersionId equals cyd.Id
            join cd in _dc.CustomerDetails on cy.CompanyId equals cd.CompanyId
            join d in _dc.Documents on cd.CustomerId equals d.CustomerId
            join di in _dc.DocumentItems on d.DocumentId equals di.DocumentId
            join dd in _dc.DocumentDetails on di.DocDetailsId equals dd.DocumentDetailsId
            join vt in _dc.Vats on dd.VATCode equals vt.VATCode
            join a in _dc.Automobiles on d.AutomobileId equals a.AutomobileId into other2
            from o2 in other2.DefaultIfEmpty()
            join v in _dc.Vouchers on dd.DocumentDetailsId equals v.DocDetailID into other1
            from o1 in other1.DefaultIfEmpty()
            where (d.DocDate >= startDate && d.DocDate <= endDate) &&
                  (d.DocNumber > 0)
                  && (d.CompanyVersionId == cyv.CompanyVersionId)
                  && (d.isDeleted == false || d.isDeleted == null)
                  && (cy.CompanyId == companyId)
            select new
                   {
                       d.DocumentId,
                       d.DocTypeId,
                       cyd.Name,
                       dd.FisCostCenter,
                       dd.FisAccountCode,
                       dd.PatAccCode,
                       dd.VATCode,
                       cd.CustomerId,
                       cd.CustomerName,
                       d.DocNumber,
                       o2.Code,
                       d.DocDate,
                       d.GrossAmount,
                       o1.FromVoucNbr,
                       dd.VATAmount,
                       dd.NetAmount,
                       vt.VATDescr,
                       d.LastModUser,
                       d.StampValue
                   };


        // GA can have a single doc with multiple doc details 
        // Month End reports needs to SUM the multiple details into single doc
        if (groupByVATandPatAcc)
        {
            var singleDocuments = from d in results
                group d by new {d.DocumentId, d.VATCode, d.PatAccCode}
                into g
                select new
                       {
                           docId = g.Key,
                           g.First().DocTypeId,
                           g.First().DocDate,
                           g.First().Name,
                           g.First().CustomerId,
                           g.First().CustomerName,
                           g.First().DocNumber,
                           VATCode = g.First().VATCode.Trim(),
                           VATAmount = g.Sum(x => x.VATAmount),
                           NetAmount = g.Sum(x => x.NetAmount),
                           g.First().GrossAmount,
                           g.First().FisCostCenter,
                           g.First().FisAccountCode,
                           g.First().PatAccCode,
                           Code = g.First().Code.ToString(),
                           g.First().FromVoucNbr,
                           g.First().VATDescr,
                           g.First().LastModUser,
                           g.First().StampValue
                       };

            return singleDocuments.Select(
                d =>
                    new ReportEntry((Enums.DocTypes) d.DocTypeId, d.DocDate, d.Name, d.CustomerId, d.CustomerName,
                        d.DocNumber, d.VATCode.Trim(), d.VATAmount, d.NetAmount, d.GrossAmount
                        , d.FisCostCenter, d.FisAccountCode, d.PatAccCode, d.Code.ToString(), d.FromVoucNbr,
                        d.VATDescr, d.LastModUser, d.StampValue)).ToList();
        }
        else
        {
            var singleDocuments = from d in results
                                  group d by new { d.DocumentId, d.VATCode }
                                      into g
                                      select new
                                      {
                                          docId = g.Key,
                                          g.First().DocTypeId,
                                          g.First().DocDate,
                                          g.First().Name,
                                          g.First().CustomerId,
                                          g.First().CustomerName,
                                          g.First().DocNumber,
                                          VATCode = g.First().VATCode.Trim(),
                                          VATAmount = g.Sum(x => x.VATAmount),
                                          NetAmount = g.Sum(x => x.NetAmount),
                                          g.First().GrossAmount,
                                          g.First().FisCostCenter,
                                          g.First().FisAccountCode,
                                          g.First().PatAccCode,
                                          Code = g.First().Code.ToString(),
                                          g.First().FromVoucNbr,
                                          g.First().VATDescr,
                                          g.First().LastModUser,
                                          g.First().StampValue
                                      };

            return singleDocuments.Select(
                d =>
                    new ReportEntry((Enums.DocTypes)d.DocTypeId, d.DocDate, d.Name, d.CustomerId, d.CustomerName,
                        d.DocNumber, d.VATCode.Trim(), d.VATAmount, d.NetAmount, d.GrossAmount
                        , d.FisCostCenter, d.FisAccountCode, d.PatAccCode, d.Code.ToString(), d.FromVoucNbr,
                        d.VATDescr, d.LastModUser, d.StampValue)).ToList();
        }
    }
public List GetReportData(DateTime startDate、DateTime endDate、int companyId、bool groupByVATandPatAcc)
{
var结果=
来自cy in_dc公司
在cy.CompanyId上的_dc.CompanyVersions中加入cyv等于cyv.CompanyId
将cyd加入到cyv上的_dc.CompanyDetails中。CompanyVersionId等于cyd.Id
将cd加入到cy.CompanyId等于cd.CompanyId的客户详细信息中
在cd上的文档中加入d。CustomerId等于d.CustomerId
将di加入到d.DocumentId上的_dc.DocumentItems等于di.DocumentId
将dd加入_dc.DocumentDetails on di.DocDetailsId等于dd.DocumentDetailsId
将vt加入dd上的_dc.Vats中。VATCode等于vt.VATCode
在d.AutomobileId上加入a.AutomobileId等于a.AutomobileId进入其他2
来自other2.DefaultIfEmpty()中的o2
将dd.DocumentDetailsId等于v.DocDetailID的凭证加入到other1中
来自other1.DefaultIfEmpty()中的o1
其中(d.DocDate>=开始日期和d.DocDate 0)
&&(d.CompanyVersionId==cyv.CompanyVersionId)
&&(d.isDeleted==false | | d.isDeleted==null)
&&(cy.CompanyId==CompanyId)
选择新的
{
d、 文档ID,
d、 DocTypeId,
cyd.姓名,
费斯考斯特中心dd,
dd.FISCountCode,
dd.PatAccCode,
dd.VATCode,
cd.CustomerId,
cd.CustomerName,
d、 文件编号,
o2.代码,
d、 DocDate,
d、 格罗萨蒙特,
o1.从VOUCNBR,
dd.VATAmount,
内塔蒙特,
瓦特迪斯科,
d、 LastModUser,
d、 StampValue
};
//GA可以有一个具有多个文档详细信息的文档
//月末报表需要将多个明细汇总成一张单据
if(groupByVATandPatAcc)
{
var singleDocuments=来自结果中的d
按新{d.DocumentId,d.VATCode,d.pataccode}划分的d组
进入g
选择新的
{
docId=g.键,
g、 First().DocTypeId,
g、 第一个().DocDate,
g、 First().Name,
g、 First().CustomerId,
g、 第一个()客户名称,
g、 首先().DocNumber,
VATCode=g.First().VATCode.Trim(),
VATAmount=g.Sum(x=>x.VATAmount),
NetAmount=g.Sum(x=>x.NetAmount),
g、 格罗萨蒙特先生,
g、 First().FisCostCenter,
g、 First().FisAccountCode,
g、 第一个().pataccode,
Code=g.First().Code.ToString(),
g、 First().FromVoucNbr,
g、 首先,VATDescr,
g、 First().LastModUser,
g、 First().StampValue
};
返回单个文档。选择(
d=>
新报表条目((Enums.DocTypes)d.DocTypeId,d.DocDate,d.Name,d.CustomerId,d.CustomerName,
d、 DocNumber,d.VATCode.Trim(),d.VATAmount,d.NetAmount,d.GrossAmount
,d.FisCostCenter,d.FisAccountCode,d.PatAccCode,d.Code.ToString(),d.FromVoucNbr,
d、 VATDescr,d.LastModUser,d.StampValue)).ToList();
}
其他的
{
var singleDocuments=来自结果中的d
按新{d.DocumentId,d.VATCode}分组d
进入g
选择新的
{
docId=g.键,
g、 First().DocTypeId,
g、 第一个().DocDate,
g、 First().Name,
g、 First().CustomerId,
g、 第一个()客户名称,
g、 首先().DocNumber,
VATCode=g.First().VATCode.Trim(),
VATAmount=g.Sum(x=>x.VATAmount),
NetAmount=g.Sum(x=>x.NetAmount),
g、 格罗萨蒙特先生,
g、 First().FisCostCenter,
g、 First().FisAccountCode,
g、 第一个().pataccode,
Code=g.First().Code.ToString(),
g、 First().FromVoucNbr,
g、 首先,VATDescr,
g、 First().LastModUser,
g、 First().StampValue
};
返回单个文档。选择(
d=>
新报表条目((Enums.DocTypes)d.DocTypeId,d.DocDate,d.Name,d.CustomerId,d.CustomerName,
d、 DocNumber,d.VATCode.Trim(),d.VATAmount,d.NetAmount
// The original query with filters
var results = ...

// Group by 3 or 2 fields
results = groupByVATandPatAcc
    ? results.GroupBy(d => new { d.DocumentId, d.VATCode, d.PatAccCode });
    : results.GroupBy(d => new { d.DocumentId, d.VATCode });

// Return list
return results.Select(g => new ReportEntry(
      g.First().DocTypeId,
      g.First().DocDate,
      g.First().Name,
      g.First().CustomerId,
      g.First().CustomerName,
      g.First().DocNumber,
      VATCode = g.First().VATCode.Trim(),
      VATAmount = g.Sum(x => x.VATAmount),
      NetAmount = g.Sum(x => x.NetAmount),
      g.First().GrossAmount,
      g.First().FisCostCenter,
      g.First().FisAccountCode,
      g.First().PatAccCode,
      Code = g.First().Code.ToString(),
      g.First().FromVoucNbr,
      g.First().VATDescr,
      g.First().LastModUser,
      g.First().StampValue))
    .ToList();