带有“AsQueryable()”问题的LinqToSQL性能问题

时间:2012-02-09 14:12:26

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

我有一个数据访问层,用作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事件探查器中,Linq-to-SQL生成嵌套查询,如下所示

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

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

提前致谢

2 个答案:

答案 0 :(得分:1)

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

select * from Orders where f1.RecordDateTime > @p1

答案 1 :(得分:1)

我实际上建议你不要以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();

当进行三次t​​oList调用时,将导致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();
}