ObjectContext,实体和加载性能

时间:2011-02-24 13:19:48

标签: entity-framework ria wcf-ria-services

我正在编写一个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();
        }
    }

但我完全不确定这是否正确。

你能帮助我并指出正确的做法吗?

提前致谢, 干杯, 詹卢卡。

1 个答案:

答案 0 :(得分:1)

  

据我所知,MyItemsis已完全加载,“Where”只过滤首次访问MyItems属性时加载的元素。

没有。那是完全错误的。在实际拥有它们之前,不要修复“性能问题”。您已经拥有的代码可能比您建议替换它的代码表现更好。它肯定不会像你描述的那样表现。但是不要相信我的话。使用性能分析器。使用SQL事件探查器。并测试!