2013-04-29 9 views
0

Предположим, у меня есть объект Entity Object 'Jewels', который имеет свойства 'Name' и 'Birthdate'. Я хочу реализовать запрос LINQ, который возвращает объект с именами «Name», «Birthdate» и «Birthstone». Поэтому я выражаю «Jewels», как это:Расширить объект Entity, чтобы включить рассчитанное свойство

public partial class JewelStones : Jewels 

string Birthstone = null; 
public void JewelsWithStone() 
{ 
    this.Birthstone = "diamond"; 
     //(we figure out what stone applies to the month here) 
} 

я могу получить это далеко, и я думаю, что я нахожусь на правильном пути, но я не знаю, как написать запрос LINQ и получить обратно объект который включает Birthstone, поэтому я могу привязать этот объект к сетке, которая покажет Birthstone, который я нигде не храню, поскольку он всегда вычисляется (это притворные данные, извините, если это не логично).

List<Jewel> jewels = new List<Jewel>; 
using (jewelentities db = new jewelentities()) 
{ 
    jewels = (from j in db.Jewels select j).ToList(); 
} 

Как заполнить мой объект JewelStone с помощью имени, даты рождения и каменного камня?

Если я не следую лучшей практике здесь, пожалуйста, дайте мне знать!

EDIT

Я попытался добавить частичный класс частичного класса Entity. Когда я ссылаюсь на класс Jewel, он «видит» свойство Birthstone, но он равен нулю. Я не знаю почему? Вот частичный класс:

public partial class Jewel 
{ 
    private string _birthstone; 
    public string Birthstone 
    { 
     get { return _birthstone; } 
     set 
     { 
      JewelBusiness jewelBusiness = new JewelBusiness(); 
      _birthstone = jewelBusiness.RequestBirthstone(birthmonth); 
     } 
    } 
} 

Если я использую LINQ для запроса объекта, чтобы получить список Jewel записей, я получаю всю информацию от объекта, Jewel.Birthstone есть, но оно равно нуль. Однако, если я делаю Еогеасп на результаты ---

foreach (Jewel j in jewels) 
{ 
    string stone = jewelBusiness.RequestBirthstone(j.Birthmonth); 
} 

камень будет равен ожидаемый результат (Birthstone для этого месяца).

Почему мой неполный класс не возвращает камень?

+0

Проверьте мой обновленный ответ –

+0

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

ответ

1

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

public partial class Jewel 
{ 
    private string _birthstone; 
    public string Birthstone 
    { 
     get 
     { 
      if (_birthstone == null) 
      { 
        JewelBusiness jewelBusiness = new JewelBusiness(); 
        _birthstone = jewelBusiness.RequestBirthstone(birthmonth); 
      } 
      return _birthstone; 
     } 
    } 
} 
0

Разве ваши драгоценности EntityObject в частичном классе тоже? Вы, скорее всего, просто добавите частичный класс Jewels, чтобы «расширить» его и добавить туда желаемую собственность.

+0

Это то, что я пытался сделать, я не уверен, как его реализовать, или если это лучший способ добавления свойств объекту объекта перед привязкой. – Jazzy

0

Для меня, это зависит от того, где логика для вычисляемого столбца находится.

Если он находится в базе данных, вы должны выполнить запрос на соединение в Linq. Я предполагаю, что в этом случае у вас есть таблица с именем BirthStoneTable, с месяцем как отношение. Я не предлагаю добавить тройную операцию внутри linq-запроса, например select j.BirthDate.Month == 1 ? "Diamond" : //etc etc. Трудно отлаживать и отслеживать (более того, для причины покрытия кода).

Если он находится в конкретных UI (только улучшить дисплей), я обычно добавляю класс типа-литой, такие как:

public class JewelUI{ 
    public explicit operator JewelUI(Jewel jewel){ 
    JewelUI jewelUI = new JewelUI(); 
    // assign birthdate and name 
    jewelUI.BirthStone = GetBirthStone(jewel.BirthDate.Month); 
    } 

    public string BirthStone{get;set;}; 

    public string GetBirthStone(int month){ 
    if(month == 1) return "Diamond"; 
    //etc etc 
    } 
} 

Если вычисляемый столбец используется в бизнес-логике, обычно я обрабатывать расчет в служебной/бизнес-логике. Все это для обеспечения хорошего Разделения Концерна.

NB: Я может неправильно понять ваши требования, хотя

+0

Я думаю, вы поняли, и ваш пример имеет смысл. В двух словах, мне нужен объект, который имеет свойства из базы данных, а затем некоторые. – Jazzy

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