Там набор значений хранится в таблице ms sql db. Эти значения указывают,
а. серийный номер изделия
б. емкость предмета
с. доступность предмета
Мне нужно создать функцию поиска, которая имеет следующие возможности и узнать элемент или комбинированные элементы, чтобы соответствовать/приближать заданную емкость,
например, заданная мощность - 8. Доступные предметы имеют емкость 10, 6, 4, 2. Есть несколько предметов с повышенной емкостью. В лучшем случае результат должен возвращать элементы с емкостью 10, прежде чем принимать решение об объединении части алгоритма. Если ни один элемент не будет удовлетворять заданной емкости, алгоритм должен продолжить объединение, но только если имеется достаточное количество элементов для объединения...
Как мне подойти к этому? Жесткая часть может найти общую емкость комбинированных предметов, когда они смежны друг с другом. В настоящее время я думаю о каждом вытягивании данных в С# и выполнять поиск или выполнять весь поиск в SQL через хранимую процедуру. Все уши, чтобы услышать и опробовать любые предложения, которые могли бы повысить производительность и удовлетворять основным критериям.
На мой взгляд, наилучшим вариантом будет хранимая процедура. Вы можете настроить его для записи в временную таблицу или переменную таблицы для первой части (идеальное или возможное совпадение, т.е.> 8), после чего вы можете проверить, чтобы увидеть количество строк в таблице temp, 0 == we не нашел его, поэтому попробуйте найти несколько элементов, которые могли бы удовлетворить совпадение.
Возможно, во второй части поиска вы можете искать элементы с числом ниже 8, но отсортированным в порядке убывания емкости. Как только вы определите тот, который имеет наивысший уровень, (позвоните ему @ok_but_not_complete_match_serialnum), тогда просто посмотрите на предметы ниже или выше этого, пока у вас не будет достаточной емкости.
Вы можете использовать несколько временных таблиц и индексов temp, чтобы все это выполнялось довольно быстро.
В запросе вы можете использовать текущие итоги Capacity, заказанные по номеру, чтобы легко идентифицировать элементы, которые будут соответствовать запросу.
Поэтому, предполагая, что серийные номера имеют заметный порядок, для второй части может работать что-то подобное
Предполагая, что @ok_but_not_complete_match_serialnum является серийным номером идентифицированного вами элемента, который имеет наивысшее (но не полное) совпадение,
select * from parts where serialnum
between @ok_but_not_complete_match_serialnum - 10
and @ok_but_not_perfect_match_serialnum + 10
Я выбрал 10 как произвольный диапазон выше и выше объекта, но, возможно, меньший # является желательным. Даже если запрос на текущие итоги не дает вам нужного вам, вы можете просто продолжать проверять следующий элемент serialnum, пока не удовлетворите его.