【问题标题】:Speed up return of linq/entity result加快 linq/entity 结果的返回
【发布时间】:2012-05-06 09:41:35
【问题描述】:

不幸的是,我维护的系统没有考虑一旦系统拥有数百万条记录会发生什么。

我遇到的问题是代码当前的编写方式,主要是 GetList 方法实际上返回数据库中的每条记录,过滤是在 getfull 方法中完成的。

我尝试通过将调整的 id 传递给 getlist 方法来更改此设置,但是当我尝试执行 .Where(a=>a.Id == journalid) 我得到这个错误

无法将类型 'System.Linq.IQueryable 隐式转换为 'System.Data.Objects.ObjectQuery

public Adjustment GetFull(int id) {
            var result = GetList(id).FirstOrDefault(ja => ja.Id == id);
            if(result == null) {
                throw new InvalidOperationException(
                    String.Format(" Adjustment with Id={0} not found.", id)
                );
            }
            return LoadFullActivities(result);
        }


        private IQueryable<Adjustment> GetList(int journalid) {
            return GetList(journalid,"Original", "Activities",
                "Original.Employee", "Original.Employee.EmployeeType", 
                "Original.Employee.WorkType", "Original.Employee.Department", 
                "Original.Activities", "Original.Status", 
                "Original.Approver", "Status");
        }

        private IQueryable<Adjustment> GetList(int journalid, params string[] includes) {
            var tempResult = dataContext.AdjustmentSet;
            foreach (var property in includes) {
                tempResult = tempResult.Include(property).Where(a=>a.Id == journalid) ;
            }
            return tempResult;
        }

【问题讨论】:

    标签: c# asp.net linq entity


    【解决方案1】:

    这将修复错误

    private IQueryable<Adjustment> GetList(int journalid, params string[] includes) {
             var tempResult = dataContext.AdjustmentSet.AsQueryable();
             foreach (var property in includes) {
                  tempResult = ((ObjectQuery<Adjustment>)tempResult).Include(property);
             }            
             return tempResult.Where(a=>a.Id == journalid);
          }
    

    那些包含会减慢查询速度。由于查询将只获得一行(并且由于包含而进行其他连接),我认为性能不会那么慢。为了提高性能,为每个外键添加索引。我猜 a.Id 已经有一个聚集索引了。

    【讨论】:

    • hmm 这仍然无法解决 tempResult = tempResult.Include(property) 加载所有记录的问题,还是会这样?
    • 它不会加载所有记录。只有某些方法会加载 ToList()、ToArray()、First 等记录。包含延迟执行原则的保存器
    • 这实际上没有用。 .includes 仍然调用数据库中的所有数据,然后进行过滤。我实际上想阻止从数据库中返回所有数据
    • 我更新了。原始答案甚至无法编译。我测试了这个查询,它使用了过滤器,正如预期的那样,没有加载整个表。
    • 如果您看到其他数据,来自您不想加载的其他关系,您应该使用 ContextOptions.LazyLoadingEnabled = false;
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多