Insight.Database使用自动界面从JOIN进行一对多映射

时间:2014-11-27 22:26:06

标签: sql-server insight.database

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 个答案:

答案 0 :(得分:1)

看起来你想要返回一个像这样的记录集:

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

并将其转换为这些对象:

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

洞察力需要将啤酒去重复,并将眼镜包裹在父母身上。

目前还没有支持这种情况,但将它添加为新类型的记录阅读器(然后将其绑定到接口实现)并不会太困难。

根据您的使用情况,返回两个记录集中的数据可能会也可能不会更好/更快。两个记录集可能会再次扫描索引,但它们可能在内存中,并且可能比复制每个子记录中的数据更快。找出答案的唯一方法是分析您的数据。

如果您发现仍需要在单个记录集中返回数据,请在github网站上打开功能请求,我们会考虑实施它。