加入和组的 LINQ 最大日期
LINQ max date with join and group
我想不通并测试了类似问题的一些答案。
现在我需要一个linq pro。 :)
以下使用 linq returns 的查询每个 device.storeID 和 device.deviceID 具有 DeviceList 中的最大日期:
var query = (from device in db.DeviceList
join store in db.stores on device.storeID equals store.id
join type in db.devices on device.deviceID equals type.id
group device by new { device.storeID, device.deviceID } into g
select new
{
deviceID = g.Key.deviceID,
storeID = g.Key.storeID,
MaxDate = g.Max(d => d.Date)
});
在设备中也有 device.amount,但我无法访问:
var query = (from device in db.DeviceList
join store in db.stores on device.storeID equals store.id
join type in db.devices on device.deviceID equals type.id
group device by new { device.storeID, device.deviceID } into g
select new
{
amount = device.amount,
deviceID = g.Key.deviceID,
storeID = g.Key.storeID,
MaxDate = g.Max(d => d.Date)
});
因为不在群里。但是如果我在组中添加:
group device by new { device.storeID, device.deviceID, device.amount } into g
select new
{
amount = g.Key.amount,
deviceID = g.Key.deviceID,
storeID = g.Key.storeID,
MaxDate = g.Max(d => d.Date)
});
我得到的结果比我需要的多。对我来说这似乎是合乎逻辑的,但是我可以在没有分组的情况下获得 amount 吗?我不需要 device.storeID 和 device.deviceID 以及 DeviceList 中每个金额的最大日期。
哦,顺便说一句:如您所见,我尝试加入商店并键入以获取 store/device 名称。我如何添加:
select new
{
deviceName = type.name,
deviceID = g.Key.deviceID,
storeID = g.Key.storeID,
MaxDate = g.Max(d => d.Date)
});
???
感谢您的每一个有用提示!
@拉法尔:谢谢!也许我的查询有更简单的解决方案。所以我必须解释我想从数据库中读取什么。
table 设备包含:
device.id device.deviceID device.storeID device.amount device.Date
123 52 20 10 2021-11-11
124 57 20 5 2021-12-01
125 57 20 2 2021-12-02
126 52 20 8 2021-12-03
127 52 21 3 2021-12-03
因此,我需要每个不同的 storeID 和最后一个 (max/highest) 日期的数量的每个不同的 deviceID:
device.id device.deviceID device.storeID device.amount device.Date
125 57 20 2 2021-12-02
126 52 20 8 2021-12-03
127 52 21 3 2021-12-03
如果您稍等片刻并在 sql 中编写相同的查询,您将同样意识到不能 select 从这些组中编辑数量,只是因为您的商店和设备组中有多个值.正如@Juharr 所指出的,您可以对金额进行汇总,因为您很可能想知道这些金额的总和,而不是从组中随机取一个?或者也许您知道您需要哪一个?最大日期的那个?
如果您所追求的最大日期比您需要在分组依据和 select 之后加入设备:
var query = (from device in db.DeviceList
join store in db.stores on device.storeID equals store.id
group device by new { device.storeID, device.deviceID } into g
select new
{
deviceID = g.Key.deviceID,
storeID = g.Key.storeID,
MaxDate = g.Max(d => d.Date)
}) into s
let dev = db.devices.FirstOrDefault(x =>
x.deviceID == s.deviceID
&& x.storeID == s.storeID
&& s.MaxDate == x.Date)
join type in db.devices on dev.deviceID equals type.id
select new {
s.deviceID,
s.storeID,
s.MaxDate,
dev.amount,
type.name
};
这也不完美,因为您可以拥有多个具有相同日期的设备记录,而恰好是最大日期,因此它会(半)随机选择一个,或者您可以在 FirstOrDefault
之前添加一些顺序
简短的回答是你没有正确定义你想从数据库中读取的数量或类型。
还有一个专业提示,除非万不得已,否则不要使用连接语法。默认情况下,以这种方式编写查询会降低 EF 为您生成查询的能力,增加您的工作量,因为您需要考虑关系和外键,而不是考虑需求是什么。您应该默认使用 Navigation Properites,当 EF 无法创建正确的代码时,您可以回退以加入语法并修复查询。通常 EF 查询就足够了。
我想不通并测试了类似问题的一些答案。 现在我需要一个linq pro。 :)
以下使用 linq returns 的查询每个 device.storeID 和 device.deviceID 具有 DeviceList 中的最大日期:
var query = (from device in db.DeviceList
join store in db.stores on device.storeID equals store.id
join type in db.devices on device.deviceID equals type.id
group device by new { device.storeID, device.deviceID } into g
select new
{
deviceID = g.Key.deviceID,
storeID = g.Key.storeID,
MaxDate = g.Max(d => d.Date)
});
在设备中也有 device.amount,但我无法访问:
var query = (from device in db.DeviceList
join store in db.stores on device.storeID equals store.id
join type in db.devices on device.deviceID equals type.id
group device by new { device.storeID, device.deviceID } into g
select new
{
amount = device.amount,
deviceID = g.Key.deviceID,
storeID = g.Key.storeID,
MaxDate = g.Max(d => d.Date)
});
因为不在群里。但是如果我在组中添加:
group device by new { device.storeID, device.deviceID, device.amount } into g
select new
{
amount = g.Key.amount,
deviceID = g.Key.deviceID,
storeID = g.Key.storeID,
MaxDate = g.Max(d => d.Date)
});
我得到的结果比我需要的多。对我来说这似乎是合乎逻辑的,但是我可以在没有分组的情况下获得 amount 吗?我不需要 device.storeID 和 device.deviceID 以及 DeviceList 中每个金额的最大日期。
哦,顺便说一句:如您所见,我尝试加入商店并键入以获取 store/device 名称。我如何添加:
select new
{
deviceName = type.name,
deviceID = g.Key.deviceID,
storeID = g.Key.storeID,
MaxDate = g.Max(d => d.Date)
});
???
感谢您的每一个有用提示!
@拉法尔:谢谢!也许我的查询有更简单的解决方案。所以我必须解释我想从数据库中读取什么。
table 设备包含:
device.id device.deviceID device.storeID device.amount device.Date
123 52 20 10 2021-11-11
124 57 20 5 2021-12-01
125 57 20 2 2021-12-02
126 52 20 8 2021-12-03
127 52 21 3 2021-12-03
因此,我需要每个不同的 storeID 和最后一个 (max/highest) 日期的数量的每个不同的 deviceID:
device.id device.deviceID device.storeID device.amount device.Date
125 57 20 2 2021-12-02
126 52 20 8 2021-12-03
127 52 21 3 2021-12-03
如果您稍等片刻并在 sql 中编写相同的查询,您将同样意识到不能 select 从这些组中编辑数量,只是因为您的商店和设备组中有多个值.正如@Juharr 所指出的,您可以对金额进行汇总,因为您很可能想知道这些金额的总和,而不是从组中随机取一个?或者也许您知道您需要哪一个?最大日期的那个?
如果您所追求的最大日期比您需要在分组依据和 select 之后加入设备:
var query = (from device in db.DeviceList
join store in db.stores on device.storeID equals store.id
group device by new { device.storeID, device.deviceID } into g
select new
{
deviceID = g.Key.deviceID,
storeID = g.Key.storeID,
MaxDate = g.Max(d => d.Date)
}) into s
let dev = db.devices.FirstOrDefault(x =>
x.deviceID == s.deviceID
&& x.storeID == s.storeID
&& s.MaxDate == x.Date)
join type in db.devices on dev.deviceID equals type.id
select new {
s.deviceID,
s.storeID,
s.MaxDate,
dev.amount,
type.name
};
这也不完美,因为您可以拥有多个具有相同日期的设备记录,而恰好是最大日期,因此它会(半)随机选择一个,或者您可以在 FirstOrDefault
之前添加一些顺序简短的回答是你没有正确定义你想从数据库中读取的数量或类型。
还有一个专业提示,除非万不得已,否则不要使用连接语法。默认情况下,以这种方式编写查询会降低 EF 为您生成查询的能力,增加您的工作量,因为您需要考虑关系和外键,而不是考虑需求是什么。您应该默认使用 Navigation Properites,当 EF 无法创建正确的代码时,您可以回退以加入语法并修复查询。通常 EF 查询就足够了。