假设我有一个实体对象'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);
}
石头将等于预期结果(当月的诞生石)。
为什么我的部分班级没有返回诞生石?
答案 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
}
}
如果在业务逻辑中使用计算列,通常我会处理服务/业务逻辑中的计算。所有这些都是为了确保良好的关注分离。
注意:我可能会误解你的要求