C# 使用具有附加属性的实体框架
我有两个表,一个名为Products,另一个名为Samples,带有产品的外键。 一个样本仅仅由一个十进制值和一个时间戳组成。 一个产品有一个名字,就是它。但是我希望价格(十进制)与产品相关联。价格应为样本中的最新样本C# 使用具有附加属性的实体框架,c#,entity-framework,C#,Entity Framework,我有两个表,一个名为Products,另一个名为Samples,带有产品的外键。 一个样本仅仅由一个十进制值和一个时间戳组成。 一个产品有一个名字,就是它。但是我希望价格(十进制)与产品相关联。价格应为样本中的最新样本 我对使用实体框架很感兴趣,但是当产品实体不直接在表中并且需要事先执行一些“计算”时,如何实现具有价格值的产品实体?有一个名为NotMapped的属性,它可以让您创建一个没有映射到数据库的属性。先编写代码,这样应该可以: public class Product { pub
我对使用实体框架很感兴趣,但是当产品实体不直接在表中并且需要事先执行一些“计算”时,如何实现具有价格值的产品实体?有一个名为NotMapped的属性,它可以让您创建一个没有映射到数据库的属性。先编写代码,这样应该可以:
public class Product
{
public int Id { get; set; }
public virtual IEnumerable<Sample> Samples { get; set; }
[NotMapped]
public decimal Price
{
get { return Samples.OrderByDescending(x => x.TimeStamp).First().Price; }
}
}
public class Sample
{
public int Id {get; set;}
public decimal Price { get; set; }
[Timestamp]
public byte[] TimeStamp {get; set;}
}
公共类产品
{
公共int Id{get;set;}
公共虚拟IEnumerable示例{get;set;}
[未映射]
公共十进制价格
{
获取{return Samples.OrderByDescending(x=>x.TimeStamp).First().Price;}
}
}
公共类样本
{
公共int Id{get;set;}
公共十进制价格{get;set;}
[时间戳]
公共字节[]时间戳{get;set;}
}
如果不是先编写代码,EF为您构建的类是分部类,因此您可以轻松地对其进行类似的扩展。您可以为示例创建分部类并添加所需的任何属性。那么我将如何/在何处实例化该属性?或者,如果您使用Fluent API而不是属性进行配置,您可以使用
Ignore
方法。但是查询不会在内存中完成,也不会在sql数据库中完成吗?我需要很好的性能,因为我有大量的数据,所以我不能忽视performance@Peter由于Samples
标记为virtual,因此它是延迟加载的。因此,只要您有产品
,您就已经有了相关的样本
。Price
属性只返回该集合中的最新样本,而不是DB。哦,太好了。当我第一次做db时,我需要做一些不同的事情吗?当我尝试使用[notmapped]道具在我的产品上迭代时,它的速度比不使用它时慢。只是让我nervous@Peter是ICollection
还是ICollection
?我希望这是第二个提供了OrderBy
。如果是第一个,您可以通过执行ICollection.cast()
将其转换为泛型类型,然后使用OrderBy
。检查有关铸造的答案。