簡體   English   中英

使用自動界面從JOIN進行Insight.Database一對多映射

[英]Insight.Database One to Many Mapping from a JOIN using Auto Interface

如果SQL具有多個SELECT語句 (一個用於Parent,另一個用於子代),則Insight.Database支持映射一對多結果。 參見: 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>

我擔心查詢的效率與單個聯接一樣。

看起來您想像這樣返回一個記錄集:

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

並將其轉換為以下對象:

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

有識之士將需要對啤酒進行重復數據刪除,然后將眼鏡包裝到父母手中。

目前尚不支持該方案,但是將其添加為一種新型的RecordReader(然后將其綁定到接口實現)並不是很難。

根據您的用例,在兩個記錄集中返回數據可能更好也可能不會更快。 兩個記錄集可以再次掃描索引,但是它們很可能在內存中,並且比在每個子記錄中復制數據要快。 找出問題的唯一方法是分析您的數據。

如果發現仍然需要在單個記錄集中返回數據,請在github站點上打開功能請求,我們將研究實現它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM