2011-02-24 23 views
1

我正在编写一个RIA服务,它也使用SOAP公开。 它的一个方法需要从一个非常大的表中读取数据。ObjectContext,实体和加载性能

在开始的时候,我做这样的事情:

public IQueryable<MyItem> GetMyItems() 
{ 
    return this.ObjectContext.MyItems.Where(x => x.StartDate >= start && x.EndDate <= end); 
} 

但后来我停了下来,因为我很担心性能。

据我了解MyItemsis完全加载和“Where”只是过滤在属性MyItems的第一次访问加载的元素。由于MyItems将会有很多行,我认为这不是正确的做法。

我试图谷歌有点问题,但没有有趣的结果出现。

所以,我想我可以在GetMyItems方法内部创建一个新的上下文实例,并有选择地加载MyItems。例如:

public IQueryable<MyItems> GetMyItems(string Username, DateTime Start, DateTime End) 
    { 
     using (MyEntities ctx = new MyEntities()) 
     { 
      var objQuery = ctx.CreateQuery<MyItems>(
       "SELECT * FROM MyItems WHERE Username = @Username AND Timestamp >= @Start AND Timestamp <= @End", 
       new ObjectParameter("@Username", Username), 
       new ObjectParameter("@Start", Start), 
       new ObjectParameter("@End", End)); 

      return objQuery.AsQueryable(); 
     } 
    } 

但我不确定这是否是正确的方法。

您能否协助我并指出正确的做法?

在此先感谢, 干杯, Gianluca。

回答

1

据我了解MyItemsis完全加载和“Where”只是过滤在属性MyItems的第一次访问加载的元素。

不,这是完全错误的。除非你真的拥有它们,否则不要修复“性能问题”。您已拥有的代码可能比您建议替换的代码执行得更好。它肯定不会像你所描述的那样行事。但不要听我的话。使用性能分析器。使用SQL Profiler。并测试!

+1

我会喜欢这个。我使用ToTraceString进行了检查,我可以看到查询是使用我提供的参数构建的,这使得我可以放心地解决可能的性能问题。谢谢克雷格! – 2011-02-24 15:49:44

+1

对于阅读此帖子的其他人:我也发现了这个有趣的页面:http://msdn.microsoft.com/en-us/library/cc853327.aspx。干杯,G. – 2011-02-24 15:50:37