Переменная величина ИЛИ, И условия на лямбе WHERE - PullRequest
0 голосов
/ 27 марта 2020

Я смотрел на подобные вопросы, но никто не смог ответить на мой вопрос. Все, что я хочу сделать, это сделать выбор с использованием lamba, но дело в том, что для выбора существует переменное количество условий OR / AND. Моя функция получает список условий AND, и ее следует выбирать исходя из этого.

Вот то, что у меня есть сейчас, и она поддерживает до 10 условий AND, передаваемых в виде строки для сравнения, но этот код ужасен. в действительности он должен быть в состоянии принять неопределенное / переменное количество условий.

Не уверен, как go узнать об этом .. ProductTags - это список тегов .. если продукт имеет все теги затем он возвращается.

public static List<product> FilterProductsByTagsAll(List<string> tags)
{
    List<product> products = new List<product>();
    switch (tags.Count)
    {
        case 1:
            products = Database.Products.Values.Where(i => i.ProductTags != null
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[0]).Any()).ToList();
            break;
        case 2:
            products = Database.Products.Values.Where(i => i.ProductTags != null
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[0]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[1]).Any()).ToList();
            break;
        case 3:
            products = Database.Products.Values.Where(i => i.ProductTags != null
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[0]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[1]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[2]).Any()).ToList();
            break;
        case 4:
            products = Database.Products.Values.Where(i => i.ProductTags != null
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[0]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[1]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[2]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[3]).Any()).ToList();
            break;
        case 5:
            products = Database.Products.Values.Where(i => i.ProductTags != null
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[0]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[1]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[2]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[3]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[4]).Any()).ToList();
            break;
        case 6:
            products = Database.Products.Values.Where(i => i.ProductTags != null
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[0]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[1]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[2]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[3]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[4]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[5]).Any()).ToList();
            break;
        case 7:
            products = Database.Products.Values.Where(i => i.ProductTags != null
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[0]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[1]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[2]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[3]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[4]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[5]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[6]).Any()).ToList();
            break;
        case 8:
            products = Database.Products.Values.Where(i => i.ProductTags != null
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[0]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[1]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[2]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[3]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[4]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[5]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[6]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[7]).Any()).ToList();
            break;
        case 9:
            products = Database.Products.Values.Where(i => i.ProductTags != null
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[0]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[1]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[2]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[3]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[4]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[5]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[6]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[7]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[8]).Any()).ToList();
            break;
        case 10:
            products = Database.Products.Values.Where(i => i.ProductTags != null
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[0]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[1]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[2]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[3]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[4]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[5]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[6]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[7]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[8]).Any()
                                                        && i.ProductTags.Where(i => i != null && i.Tag_name == tags[9]).Any()).ToList();
            break;
        default:
            break;
    }

    return products;
}

Спасибо за попытку помочь.

1 Ответ

1 голос
/ 27 марта 2020

Попробуйте этот запрос:

var allTagsProds = Database.Products.Values.Where(p => p.ProductTags != null && p.ProductTags.Select(pt => pt.Tag_name).Intersect(tags).Count() == tags.Count());

Для каждого продукта он выбирает имена тегов продуктов, а затем пересекает их со списком тегов. Это создает список имен тегов продукта, которые соответствуют списку тегов.

Затем он сравнивает количество этого списка с количеством списка тегов, и, если они совпадают, продукт имеет все теги. Затем они возвращаются.

Пример с использованием жестко закодированных моделей:

public class Tag {
    public string Tag_name {get; set;}
}

public class Product {

    public ICollection<Tag> ProductTags {get; set;} 
    public string Name {get; set;}
    }

public class Program
{
    public static void Main()
    {
        List<string> tags = new List<string> {"a","b","c","d","e","f"};

        var prodTags = new List<Tag>() {
            new Tag() {Tag_name = "a"},
            new Tag() {Tag_name = "b"},
            new Tag() {Tag_name = "c"},
            new Tag() {Tag_name = "d"}
        };

        var prodTags2 = new List<Tag>() {
            new Tag() {Tag_name = "a"},
            new Tag() {Tag_name = "b"},
            new Tag() {Tag_name = "c"},
            new Tag() {Tag_name = "d"},
            new Tag() {Tag_name = "e"},
            new Tag() {Tag_name = "f"}
        };

        var products = new List<Product>() {
            new Product() { Name="Prod1", ProductTags = prodTags },
            new Product() {  Name="Prod2",ProductTags = prodTags2 }
        };
        var allTagsProds = products.Where(p => p.ProductTags != null && p.ProductTags.Select(pt => pt.Tag_name).Intersect(tags).Count() == tags.Count());

        foreach(var prod in allTagsProds)
        {
            //Writes "Prod2"
            Console.WriteLine(prod.Name);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...