Проверьте голосовой комментарий для нескольких одновременных условий, хранящихся в базе данных - PullRequest
0 голосов
/ 09 февраля 2019

Прежде всего, я не прошу код или кого-либо, кто выполняет мою работу за меня.Просто нужно несколько идей о том, как можно применять такие правила.

У меня есть простое представление, которое отправляет некоторые данные в контроллер по уникальной паре (ключ - значение).Контроллер получает эти данные в словарь demoData.

В моей базе данных у меня есть простая таблица (Products) с идентификатором и именем.

В моей базе данных у меня также есть таблица (Правила), который содержит data_key, data_value и product_ID.Идея этой таблицы заключается в том, что когда контроллер получает значения данных, он проверяет эту таблицу и, если IF data_key равен сохраненному data_value, он добавляет product_ID к новому dict.Примерно так:

public Dictionary<int, string> testC([FromBody]Dictionary<string,string> demoData)
    {
        var getRules = AsDynamic(App.Data["Rules"]);
        // contains Link_datakey, Link_datavalue, Link_product

        var getProducts = AsDynamic(App.Data["Products"]);
        // contains Product_id, Product_name

        Dictionary<int, string> testdict = new Dictionary<int, string>();

        var product = 0;

        foreach(var r in getRules){
            if (demoData.ContainsKey(r.Link_datakey)) {
                if (demoData[r.Link_datakey] == r.Link_datavalue) {
                    product = Convert.ToInt32(r.Link_product);
                    if (!testdict.ContainsKey(product)) {
                        testdict.Add(product, getProducts.Where(i => i.id_source == r.Link_product).First().Product_name);
                    }
                }
            }
        }
        return testdict;
    }

Это прекрасно работает, но есть два серьезных ограничения:

  1. Правило должно быть "равного" типа.Если бы я хотел что-то вроде> или <, мне нужно было бы создать разные условия if для каждого из параметров, поскольку оператор не может быть переменным (я полагаю) </p>

  2. Это было создано при условиитолько одно правило будет проверено для каждого цикла.Теперь мне нужно проверить несколько правил, например:

    if (some_datakey

ИКоличество правил должно быть переменным ... Иногда это только одно, но в других продуктах это может потребовать 2 или 3.

Могу ли я спросить некоторые мнения о том, как это реализовать?Первым делом будет структура таблицы правил.Больше не будет достаточно простого продукта «ключ - значение».Возможно, что-то вроде rule_group_id - key - value, чтобы можно было сгруппировать правила, а затем новую таблицу с rule_group_id и продукт, который нужно добавить, если все условия возвращают true.Тогда в циклах должна быть предусмотрена проверка нескольких правил, и здесь я понятия не имею, как поступить.Любые идеи, которыми вы можете поделиться?

1 Ответ

0 голосов
/ 09 февраля 2019

Вот недоделанное решение, которое я придумал.

Не очень доволен им.

Нужно много пересматривать синтаксис (как предложено TryGetValue).

public Dictionary<int, string> testC([FromBody]Dictionary<string,string> demoData)
    {
        var getRules = AsDynamic(App.Data["Rules"]);
        // Link_group Link_datakey  Link_datavalue Link_operator

        var getRuleGroups = AsDynamic(App.Data["RuleGroups"]);
        // Link_group Link_product Link_type

        var getProducts = AsDynamic(App.Data["Products"]);
        // Product_id Product_name


        Dictionary<int, string> testdict = new Dictionary<int, string>();

        var product = 0;

        var rulegetcount = 0;
        var rulesetcount = 0;

        int tryparsedataint;
        bool tryparsedatabool;
        int tryparsevalueint;
        bool tryparsevaluebool;

        foreach(var rg in getRuleGroups.Where(t => t.Link_type == "add")){
            rulegetcount = getRules.Where(r => r.Link_group == rg.Link_group).Count();
            rulesetcount = 0;
            foreach(var r in getRules.Where(r => r.Link_group == rg.Link_group)){
                if (demoData.ContainsKey(r.Link_datakey)) {
                    if(r.Link_operator == "==") {
                        if (demoData[r.Link_datakey] == r.Link_datavalue) {
                            rulesetcount ++;
                        }
                    } else if(r.Link_operator == "<") {
                        tryparsedatabool = Int32.TryParse(demoData[r.Link_datakey], out tryparsedataint);
                        tryparsevaluebool = Int32.TryParse(r.Link_datavalue, out tryparsevalueint);
                        if(tryparsedatabool && tryparsevaluebool) {
                            if (tryparsedataint < tryparsevalueint) {
                                rulesetcount ++;
                            }
                        }
                    } else if(r.Link_operator == ">") {
                        tryparsedatabool = Int32.TryParse(demoData[r.Link_datakey], out tryparsedataint);
                        tryparsevaluebool = Int32.TryParse(r.Link_datavalue, out tryparsevalueint);
                        if(tryparsedatabool && tryparsevaluebool) {
                            if (tryparsedataint > tryparsevalueint) {
                                rulesetcount ++;
                            }
                        }
                    } else if(r.Link_operator == "!=") {
                        if (demoData[r.Link_datakey] != r.Link_datavalue) {
                            rulesetcount ++;
                        }
                    }
                }
            }

            if (rulegetcount == rulesetcount) {
                product = Convert.ToInt32(rg.Link_product);
                if (!testdict.ContainsKey(product)) {
                    testdict.Add(product, getPropList.Where(i => i.Product_id == rg.Link_product).First().Product_name);
                }
            }
        }

        return testdict;
    }
...