【问题标题】:Linq filtering/search logicLinq 过滤/搜索逻辑
【发布时间】:2019-07-29 08:28:15
【问题描述】:

我有拥有公寓字段的建筑实体。我只想过滤那些至少有一个公寓搜索模型的建筑物。

请求搜索模型 JSON:

{ 
   ........

  "numberOfRooms": null, 
  "isStudio": true, 
  "isNoPlanning": true, 
  "isMultiRoom": true, 

   ......
}

这是我的过滤逻辑

IEnumerable<Building> buildings = buildingApiDTO.Where(numberOfRooms => (searchModel.NumberOfRooms == null || numberOfRooms.Appartments.Any(roomsCount => searchModel.NumberOfRooms.Contains(roomsCount.RoomsCount.ToString())))
                || (searchModel.IsStudio == false || (searchModel.IsStudio == true && numberOfRooms.Appartments.Any(isStudio => isStudio.IsStudio)))
                || (searchModel.IsNoPlanning == false || (searchModel.IsNoPlanning == true && numberOfRooms.Appartments.Any(isNoPlanning => isNoPlanning.IsFreePlaning)))
                || (searchModel.IsMultiRoom == false || (searchModel.IsMultiRoom == true && numberOfRooms.Appartments.Any(multiRoom => multiRoom.RoomsCount >= 4))))

这些是我的实体。

public class Building 
{
  .....

  public ICollection<Apartment> Apartments {get;set;}

  .....
}

这是我的公寓课。

public class Apartment 
    {
    public bool IsStudio {get;set;}

    public bool IsFreePlaning {get;set;}

    public bool IsMultiRoom {get;set;}

    public int Roomscount {get;set;}
}

总的来说,我的过滤器逻辑无法正常工作。我也得到了没有工作室或没有平面公寓的建筑物。如何仅过滤只有一室公寓或多房间或免费平面公寓的建筑物?

【问题讨论】:

  • Linq 过滤器应该像这样使用。 IEnumerable.Where(x => x.Variable == State)
  • 我不确定它是否与谓词构建器有关(添加一些带有条件的过滤器)。还是调试部分过滤器?
  • 您是否尝试过将查询转换为带有 if 条件的循环?有时找出问题所在是有帮助的。通常错误使用||,而&amp;&amp; 应该是站立的

标签: c# .net linq asp.net-core


【解决方案1】:

如果我理解正确,对于每种情况,您需要检查它是工作室/多房间/没有规划,以及它是 不是其他 2。

IEnumerable<Building> buildings = buildingApiDTO.Where(numberOfRooms => (searchModel.NumberOfRooms == null || numberOfRooms.Appartments.Any(roomsCount => searchModel.NumberOfRooms.Contains(roomsCount.RoomsCount.ToString())))
    || (
        searchModel.IsStudio && 
        numberOfRooms.Appartments.Any(isStudio => isStudio.IsStudio) &&
        !searchModel.IsNoPlanning && 
        !searchModel.IsMultiRoom
        )
    || (
        searchModel.IsNoPlanning && 
        numberOfRooms.Appartments.Any(isNoPlanning => isNoPlanning.IsFreePlaning) && 
        !searchModel.IsStudio && 
        !searchModel.IsMultiRoom
        )
    || (
        searchModel.IsMultiRoom && 
        numberOfRooms.Appartments.Any(multiRoom => multiRoom.RoomsCount >= 4) && 
        !searchModel.IsStudio && 
        !searchModel.IsNoPlanning
        )
    )

【讨论】:

    【解决方案2】:

    这是我的理解。尝试根据条件构建查询

    var query = buildingApidDto.AsQueryable();
    
    // check if search has number of rooms
    if (searchModel.NumberOfRooms != null) 
    {
       query = query.Where(numberOfRooms.Appartments.Any(roomsCount => searchModel.NumberOfRooms.Contains(roomsCount.RoomsCount.ToString())))
    }
    
    //check if search is studio
    if (searchModel.IsStudio)
    {
        query = query.Where(numberOfRooms => numberOfRooms.Appartments.Any(isStudio => isStudio.IsStudio)))
    }
    else
    {
        query = query.Where(numberOfRooms => numberOfRooms.Appartments.Any(isStudio => !isStudio.IsStudio)))
    }
    
    //check if search is no planning
    if (searchModel.IsNoPlanning)
    {
        query = query.Where(numberOfRooms => numberOfRooms.Appartments.Any(isNoPlanning => isNoPlanning.IsFreePlaning)))
    }
    else
    {
        query = query.Where(numberOfRooms => numberOfRooms.Appartments.Any(isNoPlanning => !isNoPlanning.IsFreePlaning)))
    }
    
    //check if search is multi room
    if (searchModel.IsMultiRoom)
    {
        query = query.Where(numberOfRooms => numberOfRooms.Appartments.Any(multiRoom => multiRoom.RoomsCount >= 4))))
    }
    else
    {
         //just adding the opposite
         query = query.Where(numberOfRooms => 
       numberOfRooms.Appartments.Any(multiRoom => multiRoom.RoomsCount < 4))))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多