我正在编写一个RIA服务,它也使用SOAP公开。 其中一种方法需要从一个非常大的表中读取数据。
一开始我做的事情是:
public IQueryable<MyItem> GetMyItems()
{
return this.ObjectContext.MyItems.Where(x => x.StartDate >= start && x.EndDate <= end);
}
然后我停下来因为我担心表现。
据我所知,MyItemsis满载并且&#34; Where&#34;只过滤首次访问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();
}
}
但我完全不确定这是否正确。
你能帮助我并指出正确的做法吗?
提前致谢, 干杯, 詹卢卡。
答案 0 :(得分:1)
据我所知,MyItemsis已完全加载,“Where”只过滤首次访问MyItems属性时加载的元素。
没有。那是完全错误的。在实际拥有它们之前,不要修复“性能问题”。您已经拥有的代码可能比您建议替换它的代码表现更好。它肯定不会像你描述的那样表现。但是不要相信我的话。使用性能分析器。使用SQL事件探查器。并测试!