如何在实体类中使用实体上下文来提高性能?

时间:2009-10-19 16:57:08

标签: linq silverlight entity-framework

假设我有项目MyData,然后我用EF向导添加MyDb.edmx。在我的数据库中,我有表Person。然后我将在EF模型中获得一个实体Person。

然后我想在分离的文件person.cs中将此Person扩展为部分类,如:

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。

如果我有十多个这样的扩展属性,性能将非常糟糕。 如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

首先,我强烈建议避免将其放入财产中。属性应该几乎没有代码 - 在这种情况下,你将要执行重要的逻辑,使用一个方法(即:GetMyTotal())更有意义,因为这将使它更明显此时您将要运行可能长时间运行的进程的用户。

话虽如此,你有几个选择。我个人的偏好是预取这些信息。您可以更改您的实体以提取results from a Stored Procedure instead of a table。这将允许您在服务器上预先计算所有这些值,并且只通过网络提取单个结果。

这也有一个优点,即允许您在客户端上“缓存”此值,这意味着您可以将其保留为属性(因为总值已经在实体中)。