【问题标题】:Filter values from DB by 4 parameters通过 4 个参数从 DB 中过滤值
【发布时间】:2019-11-21 07:40:57
【问题描述】:

我有经验实体 就是这样:

public class Experience:BaseEntity
{
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual DateTime? CreationDate { get; set; }
    public virtual string City { get; set; }
    public virtual int Price { get; set; }
    public Currency Currency { get; set; }
    public virtual int Rating { get; set; }
    public virtual double? Lat { get; set; }
    public virtual double? Lng { get; set; }
    public virtual DateTime? CompleteDate { get; set; }
    public virtual string CoverPic { get; set; }
    public virtual string Images { get; set; }
    public virtual string BroadcastingType { get; set; }
    public virtual bool IsActive { get; set; }
    public virtual bool IsFinished { get; set; }
    public virtual bool IsConfirmed { get; set; }
    public virtual int CountryId { get; set; }
    [ForeignKey("CountryId")]
    public virtual Country Country { get; set; }
    public virtual string UserId { get; set; }
    [ForeignKey("UserId")]
    public virtual AppUser IdentityUser { get; set; }


    public virtual ICollection<Proposals.Proposals> Proposals { get; set; }
    public virtual ICollection<Comments.Comments> Comments { get; set; }
}

我需要按最高和最低价格、评级和 countryId 过滤它。

所以我写了这个方法

public async Task<List<ExperienceListDto>> GetFilteredExperiences(FilterExperienceDto filterExperience)
    {
        var experiences = await _context.Experiences.Where(x =>
                x.Price >= filterExperience.MinPrice && x.Price <= filterExperience.MaxPrice &&
                filterExperience.MinPrice.HasValue && filterExperience.MaxPrice.HasValue ||
                x.Rating == filterExperience.Rating && filterExperience.Rating.HasValue ||
                x.CountryId == filterExperience.CountryId && filterExperience.CountryId.HasValue)
            .ProjectTo<ExperienceListDto>().ToListAsync();


        return experiences;
    }

但它仅按最低、最高价格过滤。我想按所有参数过滤它。我该怎么做?

【问题讨论】:

  • 我认为你的问题是你没有使用括号。按照您想要的逻辑方式将您的条件分组在括号中。我认为它不会像您期望的那样分支。

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


【解决方案1】:

您需要以这种方式编写代码以获得所需的结果:

IQueryable<Experience> query = _context.Experiences;

if (filterExperience.MinPrice.HasValue && filterExperience.MaxPrice.HasValue)
    query = query.Where( x => x.Price >= filterExperience.MinPrice && x.Price <= filterExperience.MaxPrice);

if (filterExperience.Rating.HasValue)
    query = query.Where(x => x.Rating == filterExperience.Rating);

if (filterExperience.CountryId.HasValue)
    query = query.Where( x => x.CountryId == filterExperience.CountryId);

var experienceList = query.ToList();

参考:https://stackoverflow.com/a/5541505/1273882

【讨论】:

    【解决方案2】:

    您只需要过滤请求正文中的值。

    var query  = await _context.Experiences.AsQueryable();
    
                        if(filterExperience.MinPrice.HasValue)
                            query = query.Where(x.Price >= filterExperience.MinPrice)
    
                        if (filterExperience.MaxPrice.HasValue)
                            query = query.Where(x.Price >= filterExperience.MaxPrice);
    
                        if(filterExperience.Rating.HasValue)
                            query = query.Where(x.Rating == filterExperience.Rating);
    
                        .
                        ..
                        ....
    
    
    
                        var expriences = query.ProjectTo<ExperienceListDto>().ToListAsync();
    

    【讨论】:

      【解决方案3】:

      我注意到 ||/OR 语句可能会弄乱您想要的结果,因为条件运算符的执行顺序可能不同。

      从您当前的代码中,您可以连续执行.Where() 来逐步过滤它们

      public async Task<List<ExperienceListDto>> GetFilteredExperiences(FilterExperienceDto filterExperience)
      {
         var experiences = await _context.Experiences
      .Where(x => x.Price >= filterExperience.MinPrice && x.Price <= filterExperience.MaxPrice && filterExperience.MinPrice.HasValue && filterExperience.MaxPrice.HasValue)
      .Where(x.Rating == filterExperience.Rating && filterExperience.Rating.HasValue)
      .Where(x.CountryId == filterExperience.CountryId && filterExperience.CountryId.HasValue)
                  .ProjectTo<ExperienceListDto>().ToListAsync();
      
      
         return experiences;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-03-23
        • 1970-01-01
        • 2017-06-23
        • 2016-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        相关资源
        最近更新 更多