linq для sql OnLoaded () с представлением SQL?

Я пытаюсь расширить свою сущность Linq-to-Sql несколькими дополнительными свойствами. Это «вычисляемые» свойства, основанные на данных из базового представления SQL. Например, подумайте о поле «Дата рождения», которое используется для вычисления расширенного поля «Возраст».

Я попытался расширить свой класс сущности, расширив метод OnLoaded ().

Однако я получаю сообщение об ошибке времени компиляции, в котором говорится, что я не могу ее создать. Я проверил код конструктора для своего класса сущности LTS, и он не имеет частичного определения ни для одной из ожидаемых точек расширения.

Я проверил несколько других моих классов сущностей LTS, и они действительно имеют эти точки расширения. Единственное различие, которое я вижу, заключается в том, что тот, у которого нет, загружается из представления SQL, а не из таблицы. Есть ли способ подключиться к событию «Loaded» при загрузке из представления SQL?

TIA!


person Brian    schedule 01.05.2009    source источник


Ответы (2)


Я обнаружил, что у меня не указан PrimaryKey для моего класса сущности Linq-to-Sql. Я считаю, что без указанного первичного ключа в классе сущности не создаются методы расширения. Как только я указал первичный ключ в определении моего класса сущности LTS (через конструктор), я смог расширить событие OnLoaded ().

person Brian    schedule 06.05.2009

Вы можете сделать это с помощью свойства. Просто создайте частичный класс с тем же именем, что и ваша сущность. Любые свойства или методы, которые вы добавляете, автоматически становятся частью сущности и позволяют использовать любой из ее членов.

Вот пример шаблона:

public partial class [The Name of the Entity]
{
   public int Age
   {
      get
      {
         return CalculateAge(this.DateOfBirth);
      }
   }
}

Вот некоторая логика расчета возраста (Источник: Geekpedia)

public static int CalculateAge(DateTime BirthDate)
{
    int YearsPassed = DateTime.Now.Year - BirthDate.Year;
    // Are we before the birth date this year? If so subtract one year from the mix
    if (DateTime.Now.Month < BirthDate.Month || 
          (DateTime.Now.Month == BirthDate.Month && DateTime.Now.Day < BirthDate.Day))
    {
        YearsPassed--;
    }
    return YearsPassed;
}
person Jose Basilio    schedule 01.05.2009
comment
Да, я пытался избежать этого, потому что вычисления, которые я выполняю, на самом деле намного больше, чем вычисление возраста, и я хотел избежать необходимости пересчитывать каждый раз при вызове свойства. Я знаю, что могу обойти это с помощью проверки, чтобы сначала увидеть, был ли уже рассчитан возраст, но я надеялся, что мне не придется загрязнять мой код всевозможными проверками if (myValue! = Null). - person Brian; 01.05.2009