Отображение базы данных Insight.Database One-Many из JOIN с использованием автоинтерфейса

Insight.Database поддерживает отображение результатов "один ко многим", если в SQL имеется несколько операторов SELECT, один для родительского и дочерний. См.: https://github.com/jonwagner/Insight.Database/wiki/Specifying-Result-Structures

CREATE PROC GetBeerAndPossibleGlasses AS
SELECT * FROM Beer
SELECT b.BeerID, g.* FROM Beer JOIN Glasses ON (...)

class Beer
{
    public int ID;
    public IList<Glass> Glasses;
}

var results = connection.Query("GetBeerAndPossibleGlasses", Parameters.Empty,
    Query.Returns(Some<Beer>.Records)
        .ThenChildren(Some<Glasses>.Records);

Можно ли сопоставить один-ко-многим, используя один запрос соединения? Я считаю, что это поддерживается в Petapoco. (Я использую реализацию автоинтерфейса, но я хотел бы знать, есть ли какой-либо способ сделать это.) Например

CREATE PROC GetBeerAndPossibleGlasses AS    
SELECT b.*, g.* FROM Beer JOIN Glasses ON (...)

У меня довольно сложный запрос, где мне нужно вернуть родителей и детей, как указано выше. Это работает, если я создаю несколько операторов SELECT, но мой оператор SELECT выглядит следующим образом:

SELECT * FROM Beer WHERE <Complex WHERE clause>
SELECT b.BeerID, g.* FROM Beer JOIN Glasses ON (...) <Complex WHERE clause>

Я обеспокоен тем, что запрос так же эффективен, как и одно соединение.

1 ответ

Похоже, вы хотите вернуть один набор записей следующим образом:

Beer=1, Glass=A
Beer=1, Glass=B

И преобразовать его в эти объекты:

Beer {
    ID=1
    Glasses = {
         Glass { ID=A }
         Glass { ID=B }
    }
}

Проницательность должна была бы дублировать пиво и обернуть очки в родителей.

Этот сценарий в настоящее время не поддерживается, но не составит труда добавить его в качестве нового типа устройства чтения записей (а затем связать его с реализацией интерфейса).

Возвращение данных в двух наборах записей может быть или не быть лучше / быстрее, в зависимости от вашего варианта использования. Два набора записей могут снова сканировать индексы, но они, скорее всего, находятся в памяти и могут быть быстрее, чем дублирование данных в каждой дочерней записи. Единственный способ узнать это - профилировать ваши данные.

Если вы обнаружите, что вам по-прежнему необходимо возвращать данные в одном наборе записей, откройте запрос функции на сайте github, и мы рассмотрим его реализацию.

Другие вопросы по тегам