Недавно изучаем Haskell, так что здесь рекурсивное решение.
static IEnumerable<string> SplitByPair(string input, char[] delimiter)
{
var sep1 = input.IndexOfAny(delimiter);
if (sep1 == -1)
{
yield break;
}
var sep2 = input.IndexOfAny(delimiter, sep1 + 1);
if (sep2 == -1)
{
yield return input;
}
else
{
yield return input.Substring(0, sep2);
foreach (var other in SplitByPair(input.Substring(sep1 + 1), delimiter))
{
yield return other;
}
}
}
Хорошие вещи:
Вы столкнулись с несоответствием объектно-реляционного импеданса из-за отображения между не полностью совместимыми системами. Поскольку наследование между таблицами в реляционной модели невозможно, вам придется пожертвовать чем-то в объектной модели, которая использует наследование. Будут крайние случаи независимо от того, что вы делаете, если вы не переключитесь на объектную базу данных .
Если вы определяете пользовательские операции CRUD в классах, которые расширяют Metric
, загрузка энтитов может быть сложной. Что именно будет загружено Metric.get(id)
, если каждая таблица имеет свою собственную последовательность PK, и оба Rating
и Quantity
могут иметь одинаковое числовое значение PK.
Вы можете посмотреть, как JPA решает эту проблему. Он использует пользовательские аннотации, например @MappedSuperclass
и @Entity
. Я предполагаю, что это форма проверки типов.