代码之家  ›  专栏  ›  技术社区  ›  salgiza

在Linq to SQL查询(创建为IQueryable)中进行计数将获得所有行

  •  1
  • salgiza  · 技术社区  · 15 年前

    类Customer具有以下方法,该方法通过linq查询返回IQueryable以获取客户的活动销售额:

        public IQueryable<SalesHeader> QueryCurrentSales()
        {
            // this.SalesHeaders is an association defined in the DBML between
            // the Customer and SalesHeader tables (SalesHeader.CustomerId <-> Customer.Id).
            return this.SalesHeaders
                .Where(sh => sh.Status == 1).AsQueryable();
        }
    

    我们的想法是将查询定义集中在一个点上,以便稍后我们可以获取SalesHeader行,进行计数,使用PaginatedList类(来自NerdsDelight)进行分页,并在搜索活动SalesHeader中的销售时进一步添加Where条件。

    但是,在运行SQL服务器探查器之后,我发现执行以下操作会获取所有行,然后在内存中进行计数。

        // cust is an object of type Customer.
        int rows = cust.QueryCurrentSales().count();
    

    2 回复  |  直到 11 年前
        1
  •  1
  •   Jon Skeet    15 年前

    SalesHeaders 是事实上,你觉得你需要这样做 AsQueryable IEnumerable<T> 而不是 IQueryable<T> ... 这可能就是问题所在。如果你能展示 售货员 ,我们也许能帮上忙。

    有可能不是使用 易怒的 也许 能投 IQueryable<SalesHaeder> 售货员 属性返回的表达式实际上可以作为 IQueryable<SalesHeaders>

    编辑:好的,如果它是一个实体集,那么直接修复它可能很困难。

    我知道这很难看,但是像这样的怎么样:

    public IQueryable<SalesHeader> QueryCurrentSales()
    {
        // You *may* be able to get away with this in the query; I'm not sure
        // what LINQ to SQL would do with it.
        int id = this.Id;
    
        return context.SalesHeaders
                      .Where(sh => sh.Status == 1 && sh.CustomerId == id);
    }
    

    在这里,我假设您有一些方法可以访问所讨论的数据上下文——我不记得在LINQtoSQL中是否有一种简单的方法可以做到这一点,但我希望如此。

        2
  •  0
  •   Segment    11 年前

    // cust is an object of type Customer.
    int rows = cust.QueryCurrentSales().AsQueryable<SalesHeaders>().count();