c# - Entity Framework Core:使用计算字段分组
问题描述
我正在尝试编写查询。到目前为止我所拥有的如下所示。
var x = from d in DbContext.StorageDetails
let state = (d.ReleaseDate.HasValue && d.ReleaseDate < date) || (d.TakeOrPayEndDate.HasValue && d.TakeOrPayEndDate < date) ?
StorageState.Closed :
(d.RailcarNumber == null || d.RailcarNumber == string.Empty) ?
d.TakeOrPayStartDate.HasValue ? StorageState.TakeOrPay : StorageState.Open :
(d.ArrivalDate.HasValue && d.ArrivalDate <= date) ? StorageState.Filled : StorageState.EnRoute
group d by new
{
d.CustomerId,
d.Customer.Name,
d.LocationId,
d.Location.City,
d.Location.State
} into g
select new
{
// ...
};
给我带来麻烦的部分是我想在state
每个项目中包含计算值。我不想按此值进行分组,但我希望能够对其进行求和。
// Note: This is after my group statement
select new
{
// state is a let variable and not part of x!
TotalOpen = g.Sum(x => x.state == StorageState.Open),
TotalClosed = g.Sum(x => x.state == StorageState.Closed),
// Etc.
};
有没有办法做到这一点?我似乎无法select
在group by
. 如何将此计算字段插入每个项目?
注意:StorageState
是一个枚举。我可以很容易地将它转换为int
所有这些表达式。我可以弄清楚那部分,但弄清楚它与我的问题是分开的。
解决方案
这里似乎发生了两件事:
StorageDetails
以某种方式查询DbContext
每个找到的 item(d
),有一些执行正在被处理以确定state
...state
为每个确定d
,然后对所有的d
' 进行分组,然后在仅d
选择几个属性之后...
这可能是另一种方法:
var x = DbContext.StorageDetails
.GroupBy(d => new
{
d.CustomerId,
d.Name,
d.LocationId,
d.City,
d.State
}).Select(d => new
{
d.CustomerId,
d.Name,
d.LocationId,
d.City,
d.State,
d.state = getState(d)
}).ToList();
int getState(d)
{
return (d.ReleaseDate.HasValue && d.ReleaseDate < date) || (d.TakeOrPayEndDate.HasValue && d.TakeOrPayEndDate < date) ?
StorageState.Closed :
(d.RailcarNumber == null || d.RailcarNumber == string.Empty) ?
d.TakeOrPayStartDate.HasValue ? StorageState.TakeOrPay : StorageState.Open :
(d.ArrivalDate.HasValue && d.ArrivalDate <= date) ? StorageState.Filled : StorageState.EnRoute;
}
var TotalOpen = x.Count(x => x.state == StorageState.Open),
var TotalClosed = x.Count(x => x.state == StorageState.Closed)
基本上,您首先从数据库组中获取数据。分组后,然后选择特定属性并引入一个名为state
... 但是状态是计算的,使用另一个函数从数据库中获取一行返回一个值,enum StorageState
就像你在问题上所做的那样。然后将结果作为列表返回。
只有在您拥有列表之后,才能更轻松地检查返回的哪些行包含一个open
或closed
...
现在您可以进行正常循环并遍历您的x
和 计算TotalClosed
和TotalClosed
。
推荐阅读
- kotlin - 从地图中切割具有空值的对
- c# - 为什么在没有网络连接的情况下这个 webclient post code 没有超时?
- asp.net - Asp.net gridview 按年龄排序
- kubernetes - 是否可以使用端口名称在 Kubernetes 中的多端口服务上选择端口?
- reactjs - ReactJS:TypeError:this.state.myText.map 不是函数
- azure - U-SQL 试图从嵌套的 JSON 对象中提取整数列表
- python - 与 keras h5 模型(VGG16 预训练)相比,Tensorflow lite 模型推理非常慢
- javascript - 使用 API - 加载资源失败:服务器响应状态为 400 ()
- javascript - javascript 在将鼠标悬停在按钮上时更改图像源
- python - Pandas tocsv() 函数参数 sep 在我的数据上添加双引号