Отображение базы данных 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, и мы рассмотрим его реализацию.