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(); 
}