首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"AsQueryable()“问题的LinqToSQL性能

问"AsQueryable()“问题的LinqToSQL性能
EN

Stack Overflow用户
提问于 2012-02-09 22:12:26
回答 2查看 505关注 0票数 0

我有一个数据访问层,它使用Linq-To-SQL作为ORM,并使用存储库模式。

例如

代码语言:javascript
复制
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生成一个嵌套查询,如下所示

代码语言:javascript
复制
select * from f1
(
    select * from Orders
) as f1
where f1.RecordDateTime > @p1

这种方法有没有性能问题?

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2012-02-10 11:07:51

如果删除对AsQueryable()的调用,生成的sql将不再是嵌套查询。应该是这样的-

代码语言:javascript
复制
select * from Orders where f1.RecordDateTime > @p1
票数 1
EN

Stack Overflow用户

发布于 2012-02-10 16:18:41

实际上,我建议您不要以IQueryable的身份返回。因为如果你打算对你的列表做更多的事情,那将导致数据库调用。例如:

代码语言:javascript
复制
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调用时,将导致三个数据库调用。在大多数情况下,数据库调用比在内存中循环开销更大。在这种情况下,我建议您这样做:

代码语言:javascript
复制
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,我建议你这样做:

代码语言:javascript
复制
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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9212393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档