C # Отображение вычисляемого столбца с Linq - PullRequest
1 голос
/ 23 декабря 2011

У меня есть класс Linq, который имеет свойства StartTime и FinishTime.Я пытаюсь добавить свойство RunTime в класс, который рассчитывается как FinishTime - StartTime.Мой первый подход состоял в том, чтобы добавить его как несопоставленное свойство и выполнить вычисление в get ():

[Table(Name = "Log")]
public partial class Log
{
...
    [Column(Name = "Start_Time", DbType = "DateTime NOT NULL")]
    public DateTime StartTime { get; set; }

    [Column(Name = "Finish_Time", DbType = "DateTime NOT NULL")]
    public DateTime FinishTime { get; set; }

    public int RunTime
    {
        get { return ((TimeSpan) (this.FinishTime - this.StartTime)).Seconds; }
        set { this.RunTime = value; }
    }
...
}

Сначала это работало нормально, но потом, когда я пытаюсь использовать столбец для сортировки в OrderBy, Я получаю следующую ошибку: «Элемент TestProject.Models.Log.RunTime не имеет поддерживаемого перевода в SQL».Это имеет смысл, так как это свойство не сопоставлено со столбцом базы данных, оно не может сортировать его в SQL.

Мой следующий подход состоял в том, чтобы попытаться сделать его столбцом с атрибутом «Выражение» (чтоВозможно, я не правильно использую):

[Column(Expression = "DATEDIFF(ss, Start_Time, Finish_Time) AS RunTime")]
public int RunTime { get; set; }

Но это приводит к ошибке: «Неверное имя столбца« RunTime ».»Что, опять же, имеет смысл, потому что нет столбца с именем RunTime для сопоставления.

В текущей среде, в которой я работаю, я не могу изменить базу данных.Есть ли способ добавить это свойство в мой класс и использовать его в запросе сортировки?

Спасибо!

1 Ответ

3 голосов
/ 23 декабря 2011

Если сортировка не должна происходить на стороне SQL, я предполагаю, что вы можете ToList () часть Linq / Queryable (преобразовать вещи в фактический список на стороне c # забора), а затем OrderBy нарезультат, согласно вашей исходной колонке.

(редактировать)

Хорошо, можете ли вы просто выполнить вычисления в указанном порядке к тому времени?

IEnumerable<Log> logList = db.Logs.OrderBy(x => x.FinishTime - x.StartTime)

Я раньше не пробовал, но я нене понимаю, почему это не сработает.

...