【问题标题】:LinqToSQL Performance with "AsQueryable()" Issue带有“AsQueryable()”问题的 LinqToSQL 性能
【发布时间】:2012-02-09 14:12:25
【问题描述】:

我有一个数据访问层,它使用 Linq-To-SQL 作为 ORM 并使用存储库模式。

例如

public class OrderRepository : IRepository<DTO.Order>
{
        DTO.SampleDataContext _db = null;

        public OrderRepository()
        {
            _db = DataContextFactory.Create();
        }

        public OrderRepository(DTO.SampleDataContext db)
        {
            _db = db;
        }

        public IQueryable<DTO.Order> SelectAll()
        {
            var q = from o in _db.Orders
                    select o;

            return q.AsQueryable();
        }

我的业务层使用SelectAll() 方法的结果并查询它的结果。

在 SQL Profiler 中,Linq-to-SQL 生成一个嵌套查询,类似这样

select * from f1
(
    select * from Orders
) as f1
where f1.RecordDateTime > @p1

这种方法是否存在性能问题?

提前致谢

【问题讨论】:

  • 为什么需要调用 AsQueryable()? q 已经是 IQueryable 类型了。

标签: sql-server performance linq-to-sql


【解决方案1】:

如果删除对 AsQueryable() 的调用,生成的 sql 将不再是嵌套查询。应该是这样的 -

select * from Orders where f1.RecordDateTime > @p1

【讨论】:

    【解决方案2】:

    我实际上建议您不要以 IQueryable 的形式返回。因为如果你打算对你的列表做更多的事情,这将导致数据库调用。例如:

    var test=db.YourTable.Select (u => u);
    var ls= test.Where (a =>a.SomeColumn>9 );
    var ls2= test.Where (t =>t.SomeColumn>4);
    
    test.ToList();
    ls.ToList();
    ls2.ToList();
    

    当进行三个 toList 调用时,将导致 3 个数据库调用。在大多数情况下,数据库调用比在内存中循环更昂贵。在你的情况下,我建议你做这样的事情:

    public List<DTO.Order> SelectAll()
    {
          var q = from o in _db.Orders
                  select o;
    
           return q.ToList();
    }
    public List<DTO.Order> GetByRecordeDate(DateTime recordDateTime)
    {
        var q = from o in _db.Orders
                where o.RecordDateTime>recordDateTime
                select o;
    
        return q.ToList();
    }
    

    或者,如果你真的想实现并使用 IQueryable,我建议你这样做:

    private IQueryable<DTO.Order> SelectAll()
    {
        var q = from o in _db.Orders
                select o;
    
        return q;
    }
    private List<DTO.Order> GetAll()
    {
        return SelectAll().ToList();
    }
    public List<DTO.Order> GetByRecordeDate(DateTime recordDateTime)
    {
        var q = from o in SelectAll()
                where o.RecordDateTime>recordDateTime
                select o;
    
        return q.ToList();
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2014-09-13
      • 2018-04-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多