В настоящее время я работаю над базой данных с несколькими отношениями «один ко многим» и «многие ко многим», и я изо всех сил стараюсь, чтобы ормлит работал хорошо.
У меня есть отношение один ко многимвот так:
var q2 = Db.From<GardnerRecord>()
.LeftJoin<GardnerRecord, GardnerEBookRecord>((x, y) => x.EanNumber == y.PhysicalEditionEan)
Мне нужно вернуть коллекцию ProductDto
, у которой есть вложенный список GardnerEBookRecord
.
При использовании техники SelectMult()
это не работает, потому чторазбиение на страницы разбивается, когда я конденсирую левые объединенные результаты в меньшую коллекцию, поэтому размер страницы и смещения неверны (этот метод: Как вернуть вложенные объекты с отношением "многие ко многим" с помощью автоматического запроса )
Чтобы разобраться в пейджинге, мне нужно сделать что-то вроде:
select r.*, count(e) as ebook_count, array_agg(e.*)
from gardner_record r
left join gardner_e_book_record e
on r.ean_number = e.physical_edition_ean
group by r.id
В документации нет примеров этого, и я изо всех сил пытался это выяснить.Я не вижу ничего, что могло бы работать как array_agg
в Sql
объекте OrmLite.
Я пробовал варианты:
var q2 = Db.From<GardnerRecord>()
.LeftJoin<GardnerRecord, GardnerEBookRecord>((x, y) => x.EanNumber == y.PhysicalEditionEan)
.GroupBy(x => x.Id).Limit(100)
.Select<GardnerRecord, GardnerEBookRecord>((x, y) => new { x, EbookCount = Sql.Count(y), y }) //how to aggregate y?
var res2 = Db.SelectMulti<GardnerRecord, GardnerEBookRecord>(q2);
и
var q2 = Db.From<GardnerRecord>()
.LeftJoin<GardnerRecord, GardnerEBookRecord>((x, y) => x.EanNumber == y.PhysicalEditionEan)
.GroupBy(x => x.Id).Limit(100)
.Select<GardnerRecord, List<GardnerEBookRecord>>((x, y) => new { x, y });
var res = Db.SqlList<object>(q2);
Но я не могу понять, как объединить GardnerEBookRecord в список и сохранить правильность подкачки и смещения.
Возможно ли это?Любой обходной путь?
edit:
Я сделал проект, который вы можете запустить, чтобы увидеть проблему:
https://github.com/GuerrillaCoder/OneToManyIssue
База данных добавлена как докер, который вы можете запуститьdocker-compose up
.Надеюсь, это показывает, что я пытаюсь сделать