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