我有一个数据访问层,用作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
这种方法是否存在任何性能问题?
提前致谢
答案 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();
当进行三次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();
}