2012-02-09 66 views
0

我有一个数据访问层,它用作ORM的Linq-To-SQL并使用存储库模式。“AsQueryable()”的LinqToSQL性能问题

例如

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到SQL生成一个嵌套查询,这样

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

是否有这种做法的任何性能问题的东西吗?

在此先感谢

+0

你为什么需要调用AsQueryable()?无论如何,q已经是IQueryable型的。 – 2012-02-10 03:00:33

回答

1

如果删除调用AsQueryable已()生成的SQL将不再是一个嵌套查询。应该看起来像这样 -

select * from Orders where f1.RecordDateTime > @p1 
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(); 
}