2012-02-09 21 views
0

Linq-To-SQLとしてORMとして使用し、リポジトリパターンを使用するデータアクセスレイヤがあります。例"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

:あなたは本当に実装を行うと、私はこのような何かをやって、あなたをお勧めしますのIQueryableを使用したい場合は

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

または:あなたのケースで、私はこのような何かをやって、あなたをお勧めしますAsQueryable()を呼び出す必要がありますか?とにかくqはすでにIQueryable のタイプになります。 –

答えて

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

3回のデータベース呼び出しを行う3回のtoList呼び出しが行われたとき。ほとんどの場合、データベース呼び出しは高価で、その後メモリにループします。あなたはなぜ

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(); 
} 
関連する問題