扩展实体对象以包含计算属性

时间:2013-04-29 01:36:11

标签: c# linq entity-framework asp.net-4.5

假设我有一个实体对象'Jewels',它具有'Name'和'Birthdate'属性。 我想实现一个LINQ查询,返回一个具有'Name','Birthdate'和'Birthstone'的对象。所以我像这样延伸'珠宝':

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的对象,因此我可以将该对象绑定到网格这将显示诞生石,我不会存储在任何地方,因为它总是计算(这是假装数据,抱歉,如果它不符合逻辑)。

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

如何使用Name,Birthdate和Birthstone填充我的JewelStone对象?

如果我没有遵循这里的最佳做法,请告诉我!

修改

我尝试将一个分部类添加到Entity分部类中。当我现在引用Jewel类时,它会看到'Birthstone属性,但它是null。我不知道为什么?这是部分类:

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);
}

石头将等于预期结果(当月的诞生石)。

为什么我的部分班级没有返回诞生石?

3 个答案:

答案 0 :(得分: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; 
        }
    }
}

答案 1 :(得分:0)

你的珠宝EntityObject也不属于偏序课吗?你很可能只是添加一个珠宝部分类来“扩展”它并在那里添加想要的属性。

答案 2 :(得分: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
  }
}

如果在业务逻辑中使用计算列,通常我会处理服务/业务逻辑中的计算。所有这些都是为了确保良好的关注分离。

注意:我可能会误解你的要求