首页 文章

使用OrmLite和SQL加载* POCO引用

提问于
浏览
2

我有几个关于ServiceStack.OrmLite的POCO参考功能的问题 .

  • 当使用 Load*() API通过引用获取POCO时,是否在内部生成并运行单个SQL查询(使用适当的JOIN)以返回POCO及其引用,或者它是否运行单独的查询(一个用于POCO,然后一个用于每个参考)?

  • 有没有办法让 Load*() API接受自定义SQL查询(而不是SqlExpression),并且仍然能够自动加载引用,而不必为每个对象调用 LoadReferences()

我正在尝试指定一个自定义SQL语句并返回一个POCO列表,其中包含预先加载的引用,希望在引擎盖下运行单个查询 .

希望有人能够提供一些见解 .

1 回答

  • 3

    加载引用加载 1 query 以加载主表, 1 query 加载子引用,而不管子引用有多少行 .

    您可以通过查看使用 ConsoleLogFactory 时记录到控制台输出的SQL Generated来查看生成的SQL . 例如,这是一个带有控制台输出的 LoadSelect example you can run on Gistlyn

    public class Artist
    {
        public int Id { get; set; }
        public string Name { get; set; }
    
        [Reference]
        public List<Track> Tracks { get; set; }
        public override string ToString() => Name;
    }
    
    public class Track
    {
        [AutoIncrement]
        public int Id { get; set; }
        public string Name { get; set; }
        public int ArtistId { get; set; }
        public string Album { get; set; }
        public int Year { get; set; }
        public override string ToString() => Name;
    }
    
    var oldestTracks = db.Select(db.From<Track>()
        .Where(x => Sql.In(x.Year, db.From<Track>().Select(y => Sql.Min(y.Year)))));
    "Oldest Tracks: {0}".Print(oldestTracks.Dump());
    
    var oldestTrackIds = oldestTracks.Map(x => x.Id);
    var earliestArtistsWithRefs = db.LoadSelect(db.From<Artist>()
        .Where(a => oldestTracks.Map(t => t.ArtistId).Contains(a.Id)));
    "Earliest Artists: {0}".Print(earliestArtistsWithRefs.Dump());
    

    控制台输出:

    DEBUG: SQL: SELECT "Id", "Name" 
    FROM "Artist"
    WHERE "Id" In (@0,@1)
    PARAMS: @0=3, @1=4
    DEBUG: SQL: SELECT "Id", "Name", "ArtistId", "Album", "Year" FROM "Track" WHERE "ArtistId" IN (SELECT "Artist"."Id" 
    FROM "Artist"
    WHERE "Id" In (@0,@1))
    PARAMS: @0=3, @1=4
    Earliest Artists: [
        {
            Id: 3,
            Name: Nirvana,
            Tracks: 
            [
                {
                    Id: 5,
                    Name: Smells Like Teen Spirit,
                    ArtistId: 3,
                    Album: Nevermind,
                    Year: 1991
                },
                {
                    Id: 6,
                    Name: Heart-Shaped Box,
                    ArtistId: 3,
                    Album: In Utero,
                    Year: 1993
                }
            ]
        },
        {
            Id: 4,
            Name: Pearl Jam,
            Tracks: 
            [
                {
                    Id: 7,
                    Name: Alive,
                    ArtistId: 4,
                    Album: Ten,
                    Year: 1991
                },
                {
                    Id: 8,
                    Name: Daughter,
                    ArtistId: 4,
                    Album: Vs,
                    Year: 1993
                }
            ]
        }
    ]
    

    在哪里可以看到2个查询,1个查询加载主表,1个查询加载Tracks子引用 .

相关问题