Программно загрузить частичный класс LINQ2SQL - PullRequest
0 голосов
/ 05 декабря 2009

Я работаю над проектом, который позволяет пользователю добавлять время к задаче. В задаче у меня есть поле для EstimatedDuration, и я думаю, что я могу получить ActualDuration из времени, добавленного к задаче.

У меня есть класс LINQ2SQL для Задачи, а также и дополнительный класс Задачи (с использованием партиалов).

На данный момент у меня есть следующий запрос:

    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?

1 Ответ

1 голос
/ 05 декабря 2009

Добавьте свойство к вашему частичному классу 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, которая вычисляет фактическую продолжительность, и используйте представление «Задачи», которое включает рассчитанное значение. Теперь функция / запрос все равно должна будет агрегировать введенные значения длительности для каждой строки задачи в наборе результатов, поэтому она по-прежнему будет требовательной к производительности. Если у вас очень большая таблица задач и проблемы с производительностью, продолжайте подсчет рабочих таблиц. Я думаю, что даже частичное решение для класса подходит для нескольких сотен тысяч задач. Я полагаю, вы редко получаете большое количество одновременно. Элементы управления сеткой с подкачкой получают только страницу в данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...