Фильтровать значения из БД по 4 параметрам - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть объект опыта. Вот оно:

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; }
}

Мне нужно отфильтровать его по максимальной и минимальной цене, рейтингу и идентификатору страны.

Итак, я написал этот метод

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;
    }

Но он фильтрует только по минимальной, максимальной цене. Я хочу отфильтровать его по всем параметрам. Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 21 ноября 2019

Вам нужно написать свой код таким образом, чтобы получить желаемый результат:

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

0 голосов
/ 21 ноября 2019

Я заметил, что операторы || / 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;
}
0 голосов
/ 21 ноября 2019

Вам нужно, чтобы фильтр имел значение только в теле запроса.

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...