Asp.net 求和大于数字的LINQ查询

Asp.net 求和大于数字的LINQ查询,asp.net,vb.net,entity-framework,linq,Asp.net,Vb.net,Entity Framework,Linq,我在数据库中映射了仓库中的一系列货架。架子上的箱子是按立方英尺大小计量的。我想执行一个查询并过滤掉货架上有最小自由立方英尺的位置。我能够运行显示可用空间量的查询,但是限制总和的结果的WHERE子句似乎没有任何效果 以下是我的查询,以获取所有书架及其可用空间和总空间: Dim shelves As IQueryable(Of Location) = _db.Locations.Include(Function(l) l.Boxes) .Select(Function(loc) New Wi

我在数据库中映射了仓库中的一系列货架。架子上的箱子是按立方英尺大小计量的。我想执行一个查询并过滤掉货架上有最小自由立方英尺的位置。我能够运行显示可用空间量的查询,但是限制
总和的
结果的
WHERE
子句似乎没有任何效果

以下是我的查询,以获取所有书架及其可用空间和总空间:

Dim shelves As IQueryable(Of Location) = _db.Locations.Include(Function(l) l.Boxes)
    .Select(Function(loc) New With 
    {
        .LocationID = loc.LocationID,
        .WarehouseID = loc.WarehouseID,
        .Warehouse = loc.Warehouse.Name,
        .Row = loc.Row, 
        .Column = loc.Column, 
        .Bunk = loc.Bunk,
        .TotalSpace = loc.Footage,
        .FreeSpace = (loc.Footage - loc.Boxes.Select(Function(s) s.Size).DefaultIfEmpty(0).Sum()) 
     }).ToList()
这将返回每个位置的正确值,包括正确的可用空间量。当我引入
WHERE
子句时,它没有任何效果。下面是我对包含
WHERE
子句的查询:

Dim shelves As IQueryable(Of Location) = _db.Locations.Include(Function(l) l.Boxes)
    .Where(Function(l) (l.Boxes.Select(Function(e) e.Size).DefaultIfEmpty(0).Sum() >= EmptySpace))
    .Select(Function(loc) New With 
    {
        .LocationID = loc.LocationID,
        .WarehouseID = loc.WarehouseID,
        .Warehouse = loc.Warehouse.Name,
        .Row = loc.Row, 
        .Column = loc.Column, 
        .Bunk = loc.Bunk,
        .TotalSpace = loc.Footage,
        .FreeSpace = (loc.Footage - loc.Boxes.Select(Function(s) s.Size).DefaultIfEmpty(0).Sum()) 
     }).ToList()
由于
.FreeSpace
返回正确的值,我不确定为什么它不能在我的
WHERE
子句中按相同的值进行过滤。

更新 你可以使用Where谓词

.Where(Function(l) (l.Boxes.Select(Function(e) e.Size).DefaultIfEmpty(0).Sum() >= EmptySpace))
没有计算自由空间,这就是它没有效果的原因

您会注意到,在初始选择中,您将自由空间计算为

(loc.Footage - loc.Boxes.Select(Function(s) s.Size).DefaultIfEmpty(0).Sum())
请注意,
loc。Where谓词中缺少镜头

这意味着这个更新的查询应该可以工作

Dim shelves As IQueryable(Of Location) = _db.Locations.Include(Function(l) l.Boxes)
    .Where(Function(loc) (loc.Footage - loc.Boxes.Select(Function(s) s.Size).DefaultIfEmpty(0).Sum()) >= EmptySpace)
    .Select(Function(loc) New With 
    {
        .LocationID = loc.LocationID,
        .WarehouseID = loc.WarehouseID,
        .Warehouse = loc.Warehouse.Name,
        .Row = loc.Row, 
        .Column = loc.Column, 
        .Bunk = loc.Bunk,
        .TotalSpace = loc.Footage,
        .FreeSpace = (loc.Footage - loc.Boxes.Select(Function(s) s.Size).DefaultIfEmpty(0).Sum()) 
     }).ToList()

原始答案 尝试在选择后对投影对象应用过滤器

Dim shelves As IQueryable(Of Location) = _db.Locations.Include(Function(l) l.Boxes)    
.Select(Function(loc) New With 
{
    .LocationID = loc.LocationID,
    .WarehouseID = loc.WarehouseID,
    .Warehouse = loc.Warehouse.Name,
    .Row = loc.Row, 
    .Column = loc.Column, 
    .Bunk = loc.Bunk,
    .TotalSpace = loc.Footage,
    .FreeSpace = (loc.Footage - loc.Boxes.Select(Function(s) s.Size).DefaultIfEmpty(0).Sum()) 
 })
.Where(Function(loc) loc.FreeSpace >= EmptySpace)
.ToList()

这样就可以计算出可用空间并将其包含在匿名对象中。

谢谢,这是可行的。我的过程是Web API控制器的一部分,它一次只返回20个结果。这比没有where子句的查询运行慢得多,但这是可以理解的,因为它必须计算数百万立方英尺的可用空间,然后才能返回结果。你能想出一个提高性能的方法吗?@Nse我现在只看到你的信息。你知道你在where条款中犯了什么错误吗?我想我刚刚看到你的where过滤器漏掉了什么。