使用Linq中的分组数据计算实体

时间:2015-04-22 09:11:13

标签: c# linq linq-to-entities

所以我有一个表,表示一个与表示该实体的工作项的表有一对多关系的业务实体,该模式基本上是这样的:

BusinessEntity
ID    Title   ...a bunch of other fields

WorkItem
ID    BusinessEntityID    WorkItemStateID

WorkItemState
ID    StateDescription

我正在尝试编写一个Linq表达式,该表达式返回一个匿名对象,其中包含BusinessEntity的所有详细信息和一个名为PercentageComplete的字段,该字段详细说明了与WorkItemStateID为2的每个实体关联的工作项数

我尝试了以下内容:

from e in db.BusinessEntity
     let wiAll = db.WorkItem.Where(x => x.BusinessEntityID == e.ID)
     let wi2Complete = db.WorkItem.Where(x => x.WorkItemStateID == 2 && x.BusinessEntityID  == e.ID)
     select new {
         BusinessEntityID = e.ID,
         PercentComplete = wiAll.Count() > 0 ? (int?)(Math.Round((Decimal)(wi2Complete.Count() / wiAll.Count()) * 100)) : null
     }

然而这不起作用,只给我一个1或0作为PercentComplete。我正在努力破译正在生成的SQL(实际查询比这复杂得多)

这甚至是正确的方法吗?我可以不使用分组,如果是这样,我该怎么做?

1 个答案:

答案 0 :(得分:1)

只需将百分比计算表达式更改为

即可
(int?)(Math.Round(((Decimal)wi2Complete.Count() / wiAll.Count()) * 100))

它应该做的伎俩。将整数除以整数时,结果始终为整数(在您的情况下为0或1)。如果将第一个值转换为十进制,则结果也将是[0,1]范围内的十进制值。