2011-12-23 2 views
1

У меня есть класс Linq, который имеет свойства StartTime и FinishTime. Я пытаюсь добавить свойство RunTime к классу, который вычисляется как FinishTime - StartTime. Мой первый подход, чтобы добавить его в качестве неотображенной собственности и сделать расчет в ГЭТЕ():C# Отображение расчетной колонки с Linq

[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.

Мой следующий подход был попытаться сделать это столбец с атрибутом «Expression» (который я не могу быть с помощью правильно):

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

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

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

Спасибо!

+2

Только FYI - сеттер в свойстве RunTime будет вызывать исключение StackOverflow, если вы его вызываете. Лучше просто получить доступ к аксессуарам и не устанавливать. –

+0

Спасибо за ввод. Я все еще немного новичок в C#. – Paul

ответ

3

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

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

Ok, так что вы можете просто сделать вычисления в порядке тогда?

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

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

+0

избили меня ... –

+0

Hi Mikeb. Вы затронули корень моей проблемы! Я использую данные в таблице с разбивкой по страницам (jqGrid), поэтому сортировка должна выполняться на стороне SQL, чтобы быть эффективной. – Paul

+0

Это решение будет работать с некоторыми специальными обработками. У меня есть моя настройка запроса для сортировки по любому столбцу, который jqGrid передает его, поэтому мне просто нужно поставить особый случай в моей логике, чтобы сделать это, и выбрать OrderBy или OrderByDescending. – Paul

Смежные вопросы