以编程方式加载LINQ2SQL分部类

时间:2009-12-05 16:16:28

标签: c# linq-to-sql

我正在开发允许用户将时间添加到任务的项目。在任务中我有一个EstimatedDuration的字段,我的想法是我可以从添加到任务的时间中获得ActualDuration。

我有一个用于Task的LINQ2SQL类,以及另外的Task类(使用partials)。

到目前为止,我的查询有以下内容:

    public IQueryable<Task> GetTasks(TaskCriteria criteria)
    {
        // set option to eager load child object(s)
        var opts = new System.Data.Linq.DataLoadOptions();
        opts.LoadWith<Task>(row => row.Project);
        opts.LoadWith<Task>(row => row.AssignedToUser);
        opts.LoadWith<Task>(row => row.Customer);
        opts.LoadWith<Task>(row => row.Stage);
        db.LoadOptions = opts;

        IQueryable<Task> query = db.Tasks;

        if (criteria.ProjectId.HasValue())
            query = query.Where(row => row.ProjectId == criteria.ProjectId);

        if (criteria.StageId.HasValue())
            query = query.Where(row => row.StageId == criteria.StageId);

        if (criteria.Status.HasValue)
            query = query.Where(row => row.Status == (int)criteria.Status);

        var result = query.Select(row => row);

        return result;
    }

获得ActualDuration的最佳方式是什么,它只是TaskTime表中Units的总和?

1 个答案:

答案 0 :(得分:1)

向Task部分类添加一个属性,类似于:

    public int ActualDuration
    {
        get {
            YourDataContext db = new YourDataContext();
            return
                db.TaskDurations.Where(t => t.task_id == this.id).
                    Sum (t => t.duration);
        }
    }

然后您可以将实际持续时间称为Task.ActualDuration。

更新:您询问了如何使用部分类来执行此操作。当然它再次击中了数据库。从数据库中获取您还不知道的数据的唯一方法是访问数据库。如果出于性能原因需要避免这种情况,请编写一个计算实际持续时间的子查询或SQL函数,并使用包含计算值的“任务”视图。现在,函数/查询仍然必须聚合结果集中每个任务行的输入持续时间,因此它仍然是性能密集型的。如果您有一个非常大的任务表和性能问题,请在任务表上保持运行记录。我认为即使是部分类解决方案也适用于几万个任务。我会假设您很少一次检索大数字。带分页的网格控件当时只能获取一个页面。