C# 这种表结构的LINQ查询思想
我知道这是一个相当不寻常的问题,但我一直在花一些时间试图找出从异常结构化的数据库中检索数据的最快方法。基本上,数据库如下所示: “Trip”-结构简单的表,这里没有问题 “托运”-每个托运链接到上述行程。这里有趣且恼人的是,每批货物在表中有两条记录,一条记录“销售”值,另一条记录“成本”值——这些记录由字符字段('S'或'C')区分 我的查询基本上需要选择一个日期范围(日期存储在行程表中)之间的所有托运,销售和成本值在行中。下面是我现在的LINQ查询:C# 这种表结构的LINQ查询思想,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我知道这是一个相当不寻常的问题,但我一直在花一些时间试图找出从异常结构化的数据库中检索数据的最快方法。基本上,数据库如下所示: “Trip”-结构简单的表,这里没有问题 “托运”-每个托运链接到上述行程。这里有趣且恼人的是,每批货物在表中有两条记录,一条记录“销售”值,另一条记录“成本”值——这些记录由字符字段('S'或'C')区分 我的查询基本上需要选择一个日期范围(日期存储在行程表中)之间的所有托运,销售和成本值在行中。下面是我现在的LINQ查询: var cons = from cS in
var cons = from cS in dc.Consignments.Where(a => a.BreakdownType == 'S')
join cC in dc.Consignments on new { NTConsignment = cS.NTConsignment, LegacyID = cS.LegacyID, TripDate = cS.TripDate, Depot = cS.Depot, TripNumber = cS.TripNumber, BreakdownType = 'C' } equals new { NTConsingment = cC.NTConsignment, LegacyID = cC.LegacyID, TripDate = cC.TripDate, Depot = cC.Depot, TripNumber = cC.TripNumber, BreakdownType = cC.BreakdownType }
join sl in dc.SageAccounts on new { LegacyID = cS.Customer, Customer = true } equals new { LegacyID = sl.LegacyID, Customer = sl.Customer }
join ss in dc.SageAccounts on sl.ParentAccount equals ss.ID
join vt in dc.VehicleTypes on cS.Trip.VehicleType.Trim() equals vt.ID.ToString() into vtg
where cS.Trip.DeliveryDate >= dates.FromDate && cS.DeliveryDate <= dates.ToDate
orderby cS.Depot, cS.TripNumber
select new GMConsignment
{
NTConsignment = cS.NTConsignment,
Trip = cS.Trip,
LegacyID = cS.LegacyID,
Costs = cC.Value ?? 0.00m,
Sales = cS.Value ?? 0.00m,
Margin = (cS.Value ?? 0.00m) - (cC.Value ?? 0.00m),
Customer = cmS.Customer,
SageID = ss.SageID,
CustomerName = ss.ShortName,
FullCustomerName = ss.Name,
Vehicle = cS.Trip.Vehicle ?? "None",
VehicleType = vtg.SingleOrDefault().VehicleTypeDescription ?? "Subcontractor",
VehicleGroup = vtg.FirstOrDefault().VehicleGroup1
};
var cons=来自dc.commitments.Where中的cS(a=>a.BreakdownType=='S')
在新的{nt寄售=cS.nt寄售,LegacyID=cS.LegacyID,TripDate=cS.TripDate,Depot=cS.Depot,TripNumber=cS.TripNumber,细分类型='C'}上加入cC。寄售{NTConsignment=cC.ntAudition,LegacyID=cC.LegacyID,TripDate=cC.TripDate,Depot=cC.Depot,TripNumber=cC.TripNumber,BreakdownType=cC.BreakdownType}
在新{LegacyID=cS.Customer,Customer=true}等于新{LegacyID=sl.LegacyID,Customer=sl.Customer}的dc.SageAccounts中加入sl
将ss加入sl.ParentAccount上的dc.SageAccounts等于ss.ID
将vt连接到cS.Trip.VehicleType.Trim()上的dc.VehicleTypes中等于vt.ID.ToString()到vtg中
其中cS.Trip.DeliveryDate>=dates.FromDate&&cS.DeliveryDate我的第一个想法是尽可能多地使用与成本或销售值相关的计算列/视图,因此linq查询只需查看相关列/视图即可获得信息。我可以看一下您的行程和考虑表的图表吗?有没有转换加入vt的方法在cS.Trip.VehicleType.Trim()上的dc.VehicleTypes中等于vt.ID.ToString()
到表达式中?