LINQ查询 - 如何让我的查询更好?

时间:2015-04-14 17:37:27

标签: linq

我已经编写了以下 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;

2 个答案:

答案 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();

虽然因为你没有显示出你实际上总和的所有内容,我怀疑问题还不止于此。