我通常不会问自己的错误或问题,但现在我被卡住了。
我的问题是来自EF LinQ查询的结果。它应该工作,但事实并非如此。返回的数字是waaay out(如3.000.000%)
所以,把问题放在上下文中:假设你有一个组织,设计方向。每个人都朝着一个方向,被称为“资源”。
每个人都在“项目”上工作。
安抚是为了一个项目按间隔保存(例如:从第0天到第11天,它是1小时/天)
现在,我们希望所有资源(人员)按方向分组,并在一段时间内按总时间分组。
我的要求是:
var result = from r in com.Ressources
where
ids.Contains(r.Id)
&& (from p in r.Projects
where p.StartDate <= dates.To && p.EndDate >= dates.From
select p).Count() > 0
group r by r.Direction into groups
orderby groups.Key.DirectionName
select new
{
Id = groups.Key.Id,
DirectionName = groups.Key.DirectionName,
Responsable = groups.Key.Responsable.Prenom + " " + groups.Key.Responsable.Nom,
Ressources = from pr in groups
let totalpl = (double?)
(from planif in pr.Planification
let startOffset = JayaModelContainer.GetWorksDaysCount(planif.Project.StartDate, dates.From)
let endOffset = JayaModelContainer.GetWorksDaysCount(planif.Project.StartDate, dates.To)
where
planif.FromProjectDay <= endOffset && planif.ToProjectDay >= startOffset
let start = planif.FromProjectDay > startOffset ? startOffset : planif.FromProjectDay
let end = planif.ToProjectDay <= endOffset ? endOffset : planif.ToProjectDay
select (end - start + 1) * planif.Amount).Sum()
let totalrl = (double?)
(from reel in com.RealTimes
let startOffset = JayaModelContainer.GetWorksDaysCount(reel.Project.StartDate, dates.From)
let endOffset = JayaModelContainer.GetWorksDaysCount(reel.Project.StartDate, dates.To)
where reel.TimeSheet.Ressource.Id == pr.Id &&
reel.FromProjectDay <= endOffset && reel.ToProjectDay >= startOffset
let start = reel.FromProjectDay > startOffset ? startOffset : reel.FromProjectDay
let end = reel.ToProjectDay <= endOffset ? endOffset : reel.ToProjectDay
select (end - start + 1) * reel.Amount).Sum()
orderby pr.Prenom, pr.Nom
select new
{
Id = pr.Id,
FirstName = pr.Prenom,
LastName = pr.Nom,
Occupation = pr.Occupation.Name,
TotalPlanifs = totalpl,
TotalReels = totalrl,
PlannifCapacity = totalpl / maxCapacity,
ReelCapacity = totalrl / maxCapacity
}
};
但由于某种原因,返回的数字是等待的(例如每月9546%或147.000小时)
知道我的错误来自何处?
我认为它在查询中但找不到
谢谢
编辑:如果你想知道,(双?)是有原因的。如果表中没有记录,“sum”将崩溃,“Unable to cast”null“into double”。这个小技巧允许在空值上做所有表达式
EDIT2:已解决
发现我的错误!
这4个lignes中的反转值:
let start = planif.FromProjectDay > startOffset ? startOffset : planif.FromProjectDay
let end = planif.ToProjectDay <= endOffset ? endOffset : planif.ToProjectDay
let start = reel.FromProjectDay > startOffset ? startOffset : reel.FromProjectDay
let end = reel.ToProjectDay <= endOffset ? endOffset : reel.ToProjectDay
这些行应该是:
let start = planif.FromProjectDay > startOffset ? planif.FromProjectDay : startOffset
let end = planif.ToProjectDay <= endOffset ? planif.ToProjectDay : endOffset
let start = reel.FromProjectDay > startOffset ? reel.FromProjectDay : startOffset
let end = reel.ToProjectDay <= endOffset ? reel.ToProjectDay : endOffset
现在完美运作!