我有一个数据访问层,它使用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 Profiler中,Linq-to-SQL生成一个嵌套查询,如下所示
select * from f1
(
select * from Orders
) as f1
where f1.RecordDateTime > @p1这种方法有没有性能问题?
提前感谢
发布于 2012-02-10 11:07:51
如果删除对AsQueryable()的调用,生成的sql将不再是嵌套查询。应该是这样的-
select * from Orders where f1.RecordDateTime > @p1发布于 2012-02-10 16:18:41
实际上,我建议您不要以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调用时,将导致三个数据库调用。在大多数情况下,数据库调用比在内存中循环开销更大。在这种情况下,我建议您这样做:
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();
}https://stackoverflow.com/questions/9212393
复制相似问题