Sander Rossel Ответов: 0

Лучший/самый простой способ смоделировать все комбинации записи?


Всем привет,
Маленький вопрос, я знаю ответ, но я открыт для предложений или альтернатив (или подтверждения). Мое решение звучит немного сложно, но я не могу придумать ничего другого, что было бы достаточно гибким.

Проблема заключается в том, что у меня есть некоторая сущность, MyEntity, каждая запись которой может быть объединена с одной или несколькими записями MyEntity.
Например, у меня есть A, B и C.
Возможные комбинации теперь есть:
Один
Б
С
А, Б
С
B, C
А, Б, В

Теперь вот задача: у A, B и C есть процент, скажем, 100%.
Однако, при сочетании с B их изменение в процентах, например, 40% и 60%
А = 100%
B = 100%
С = 100%
А = 40%, В = 60%
А = 40%, С = 60%
B = 45%, C = 55%
А = 20%, В = 30%, С = 50%

В процентах нет никакой логики, это просто заданный процент.
Однако проценты могут меняться с течением времени, и может быть добавлен дополнительный D, меняющий не только возможные комбинации, но и соответствующие проценты.

Поэтому я ищу самый простой способ смоделировать это в SQL Server.

Я вот думаю:
MyEntity (Id, Описание)
MyEntityCombination (Id, Описание)
MyEntityCombinationValue (Id, MyEntityCombinationId, MyEntityId, Процент)

И тогда возникает следующая проблема: в моем коде C# я получаю B и C, и теперь мне нужно получить соответствующие проценты для B и C (45% и 55% в примере).
Я предполагаю, что это должно быть довольно легко с помощью Entity Framework и LINQ.
Что-то вроде:
var entities = new[] { bId, cId };
var percentages = context.MyEntityCombinations.Where(c => c.Values.Count() == entities.Length && c.Values.All(v => entities.Contains(MyEntityId)).Values;
var bPercentage = percentages.Single(p => p.MyEntityId == bId).Percentage;


Что я уже пробовал:

Я думал об этом, просто любопытствуя (более легких) альтернатив.

Gerry Schmitz

Если вы отслеживаете процентные изменения "с течением времени", то вам нужно добавить "элемент времени" в свою модель.

(И я думаю, что "Id" в MyEntityCombinationValue может быть избыточным; EF поддерживает "составные ключи".)

Sander Rossel

Я не ищу изменений с течением времени, просто лучший/самый простой способ хранения процентов.

0 Ответов