gpt4 book ai didi

c# - 使用 LINQ to Entities 的时间跨度总和

转载 作者:行者123 更新时间:2023-11-30 23:04:55 26 4
gpt4 key购买 nike

我有一个 LINQ 调用组,然后将 PossessionTime.Tick 值相加作为一个新的时间跨度。这以前工作得很好,但现在我需要将集合保留为 IQueryable 而不是 List。

PossessionTime = new TimeSpan(x.Sum(p => p.PossessionTime.Ticks))

通过此更改,我现在收到以下错误:

Only parameterless constructors and initializers are supported in LINQ to Entities.

我研究过使用 DbFunctions,但我认为它没有任何可以帮助我的东西。

我唯一的选择是将列表移动到内存中并计算那里的时间吗?

IQueryable如下:

return stats.GroupBy(x => x.Id).OrderByDescending(x => x.Sum(a => a.Kills))
.Select(x => new WeaponItem
{
PossessionTime = new TimeSpan(x.Sum(p => p.PossessionTime.Ticks))
});

我需要将它保留为 IQueryable,因为我在分页中使用它。

最佳答案

我不认为您能够通过使用直接 linq 的 Linq-to-SQL/EF 轻松完成此操作,因为 PossionTime.Ticks。 C# DateTime 操作在转换为 sql 操作时非常有限。

如果您的唯一要求是支持分页,您可以通过在分页操作后执行 WeaponItem 投影并将页面拉入内存来简化操作:

return stats
.GroupBy(x => x.Id)
.OrderByDescending(x => x.Sum(a => a.Kills))
// paginatation
.Skip(pageNumber * pageSize)
.Take(pageSize)
// pull paged result set into memory to make life easy
.ToList()
// transform into WeaponItem
.Select(x => new WeaponItem
{
PossessionTime = new TimeSpan(x.Sum(p => p.PossessionTime.Ticks))
});

或者,您可以更改 WeaponItem 类以存储 PossesionTimeTicks,然后将 PossesionTime 作为计算属性提供。这可能会绕过限制:

public class WeaponItem
{
public long PosseionTimeTicks {get;set;}
public TimeSpan PossesionTime {get{ return new TimeSpan(PosseionTimeticks); }
}

然后我认为您应该能够将查询保留为 IQueryable:

return stats
.GroupBy(x => x.Id)
.OrderByDescending(x => x.Sum(a => a.Kills))
.Select(x => new WeaponItem
{
PossessionTimeTicks = x.Sum(p => p.PossessionTime.Ticks)
});

关于c# - 使用 LINQ to Entities 的时间跨度总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49075550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com