假设我有项目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。
如果我有十多个这样的扩展属性,性能将非常糟糕。 如何解决这个问题?
答案 0 :(得分:1)
首先,我强烈建议避免将其放入财产中。属性应该几乎没有代码 - 在这种情况下,你将要执行重要的逻辑,使用一个方法(即:GetMyTotal())更有意义,因为这将使它更明显此时您将要运行可能长时间运行的进程的用户。
话虽如此,你有几个选择。我个人的偏好是预取这些信息。您可以更改您的实体以提取results from a Stored Procedure instead of a table。这将允许您在服务器上预先计算所有这些值,并且只通过网络提取单个结果。
这也有一个优点,即允许您在客户端上“缓存”此值,这意味着您可以将其保留为属性(因为总值已经在实体中)。