我已经编写了以下 LINQ 查询返回列表,然后单独迭代列表,将时间转换为小时,并为每个列表项计算小时数。
我确信这可能不会马上发送三个数据库调用。
我可以用更好的方式重写它,例如GroupBy或通过其他方式将数据分配给模型,将IdleTime转换为小时,而不是将IdleTime的总和转换为
模型类
public class TestModel
{
public string TaskSummary { get; set; }
public string LocationName { get; set; }
public float IdleTime { get; set; }
public string Description { get; set; }
public float IdleTimeSum { get; set; }
public Guid TaskId { get; set; }
}
LINQ查询
List<TestModel> list = _context.Time
.Include(x => x.Report)
.Include(x => x.Report.Task)
.Include(x => x.Report.Task.Location)
.Where(x => taskIds.Contains(x.Report.TaskId))
.Select(x => new TestModel
{
TaskSummary = x.Report.Task.Summary,
LocationName = x.Report.Task.Location.Name,
IdleTime = x.Duration,
Description = x.Description,
TaskId = x.Report.TaskId,
}).ToList();
我如何转换成小时?
foreach (var item in list)
item.IdleTime = item. IdleTime / 60;
我如何收费?
foreach (var item in list)
item.IdleTimeSum = item. IdleTime;
答案 0 :(得分:0)
是的Select
是投影功能,您可以在选择中执行这些操作。
.Select(x => new TestModel
{
TaskSummary = x.Report.Task.Summary,
LocationName = x.Report.Task.Location.Name,
IdleTime = x.Duration /60.0f,
NPTHoursSum = x.Duration / 60.0f,
Description = x.Description,
TaskId = x.Report.TaskId,
}).ToList();
如果您正在使用LINQ to SQL,那么分区操作可能会在db上进行。如果你真的想要做一笔钱,它必须在不同的查询中或作为子查询或其他东西。\
答案 1 :(得分:0)
只需将其添加到您的投影中:
.Select(x => new TestModel
{
TaskSummary = x.Report.Task.Summary,
LocationName = x.Report.Task.Location.Name,
IdleTime = x.Duration / 60.0f,
Description = x.Description,
TaskId = x.Report.TaskId,
NPTHoursSum = x.Duration / 60.0f,
}).ToList();
虽然因为你没有显示出你实际上总和的所有内容,我怀疑问题还不止于此。