Как использовать where внутри поиска для сложных поисковых запросов?

#c# #mongodb #linq

Вопрос:

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

 return Collection.Find(p => p.ProductValues.Where(pv => pv.Lang == lang)).toList();
 

И ошибка, которую я получаю, заключается в следующем

 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<TestMongodb.Entities.ProductValue>' to 'bool'
 

Мои модели

  public class Product : BaseEntity
    {
        public Product(string price, string date, List<ProductValue> value) =>
            (Price, Date, ProductValues) = (price, date, value);

        public string Price { get; set; }

        public string Date { get; set; }

        [BsonElement("value")]
        public List<ProductValue> ProductValues { get; set; }
    }
 

и

 public class ProductValue
    {
        public ProductValue(string lang, string name, string description) =>
           (Lang, Name, Description) = (lang, name, description);

        [BsonElement("lang")]
        public string Lang { get; }

        [BsonElement("name")]
        public string Name { get; }

        [BsonElement("description")]
        public string Description { get; }
    }
 

Комментарии:

1. Я не совсем понимаю ваш вопрос. Find возвращает первый соответствующий экземпляр. Почему вы пытаетесь вызвать ToList один экземпляр?

Ответ №1:

Вместо Where() этого используйте Any() ,

 return Collection.Find(p => p.ProductValues.Any(pv => pv.Lang == lang));
 

Почему Any() кончено Where() ?

  • Where(<predicate>) предложение используется для фильтрации на основе переданного ему предиката. Он возвращает набор новых отфильтрованных записей вместо true/false значений.

Any(<predicate>) : Any() возвращает true/false , если предикат удовлетворяет условию. `

Теперь Find возвращает документ на основе условия, которое возвращает логическое значение true, а не новый список. Именно по этой причине мы использовали Any() вместо Where()

Комментарии:

1. Это не работает, я все еще получаю несколько языков, мне нужно отфильтровать список и получить только правильный язык. Пример: «Значения продукта»: [ { «язык»: «ru», «имя»: «zzzz», «описание»: «строка» }, { «язык»: «ru», «имя»: «xxxx», «описание»: «строка» } ],

2. Не могли бы вы, пожалуйста, указать, что является вводом и какой вывод вы ожидаете

3. @AzadSamedov, что вы подразумеваете под правильным языком, который здесь является правильным языком?