Linq 如何在实体类中使用实体上下文来提高性能?
假设我有项目MyData,那么我将使用EF向导添加MyDb.edmx。在我的数据库中,我有一个表Person。然后我将在EF模型中得到一个实体人 然后我想在一个单独的文件Person.cs中通过分部类扩展此人,如:Linq 如何在实体类中使用实体上下文来提高性能?,linq,silverlight,entity-framework,Linq,Silverlight,Entity Framework,假设我有项目MyData,那么我将使用EF向导添加MyDb.edmx。在我的数据库中,我有一个表Person。然后我将在EF模型中得到一个实体人 然后我想在一个单独的文件Person.cs中通过分部类扩展此人,如: namespace MyData { public partial class Person { [DataMember] public int MyTotal { get
namespace MyData
{
public partial class Person
{
[DataMember]
public int MyTotal
{
get
{
int count = 0;
using (MyEntities ctx = new MyEntities())
{
//run some linq to get calc based on other entities
}
return count;
}
}
}
它很好用。然后在客户端,我可以获得属性为MyTotal的实体Person实例。
问题是:当我想在客户端列出Person(比如silverlight)时,性能非常差,因为对于Person的每个实例,它都会导致SQL DB连接失败,并为MyTotal运行一个SQL
如果我有十多个这样的扩展属性,性能会很差。
如何解决此问题?首先,我强烈建议不要将此项放在属性中。属性应该很少甚至没有代码——在这样的情况下,您将要执行重要的逻辑,使用方法(即:GetMyTotal())会更有意义,因为这将使用户更清楚地看到,此时您将运行一个可能运行很长时间的进程 也就是说,你有几个选择。我个人倾向于预取这些信息。您可以将实体更改为pull。这将允许您在服务器上预先计算所有这些值,并且仅通过连线获取单个结果
这还具有允许您在客户端上“缓存”该值的优点,这意味着您可以将其保留为属性(因为总值将已经在实体中)。使用EF自动生成的所有实体时,它将保留所有关系(关联)。如果使用存储过程检索的自定义实体,我不确定是否会保留所有这些关系。否则,您需要手动构建所有这些关联,这将是一件痛苦的事情。是的,但是您正在尝试向一个实体添加一些无法使用自动生成的实体的内容(嗯)。这正是他们添加了使用存储过程生成实体的功能的原因之一。谢谢。如果我有两个计算结果,并且我想将它们与实体(例如人)联系起来,如果不更改实体(保留所有自动生成的无更改),那么更好的解决方案是什么?好的,可能会像现在这样做,但预计算并存储结果(在构造/初始化期间),这样您就不会每次访问时都获取结果。