NPoco:连接两个表

问题描述 投票:0回答:1

我正在使用 NPoco 框架(和 Umbraco)并用它从单个表中获取大量数据。现在,我想将表连接在一起,但似乎这根本不起作用。 这两个表看起来像这样,其中 Game 是主表,而 SpecialConfig 是我加入其中的内容。它有一个外键关系

using NPoco;
using Umbraco.Cms.Infrastructure.Persistence.DatabaseAnnotations;

namespace Models.Dto;

[TableName("Game")]
[PrimaryKey("GameId", AutoIncrement = true)]
public class GameWithSpecialDto {
    [Column("GameId")]
    public int GameId { get; init; }
    
    [Column("IsFinished")]
    public bool IsFinished { get; init; }
    
    // a couple of another elements
    
    [Column("SpecialsId")]
    [ForeignKey(typeof(SpecialConfigDto), Name = "FK__Game__SpecialsId__0E04126B")]
    public required SpecialConfigDto SpecialsId { get; init; }
}

[TableName("SpecialConfig")]
[PrimaryKey("SpecialsId", AutoIncrement = true)]
public class SpecialConfigDto {
    [Column("SpecialsId")]
    public int SpecialsId { get; init; }
    
    [Column("SpecialsName")]
    public string? SpecialsName { get; init; }
}

其代码如下:

using Models.Dto;
using Serilog;
using Umbraco.Cms.Infrastructure.Scoping;

namespace Core.Repositories;

public class GameRepository {
    private readonly IScopeProvider _scopeProvider;

    public GameRepository(IScopeProvider scopeProvider) {
        _scopeProvider = scopeProvider;
    }

    public GameWithSpecialDto? GetGame(int gameId) {
        try {
            using var scope = _scopeProvider.CreateScope();
            var game = scope.Database.Query<GameWithSpecialDto>().Include<SpecialConfigDto>(game=>game.Specials).Where(game=>game.GameId==gameId);
            //var game = scope.Database.Query<GameDto>().Include(game=>game.SpecialsId).Where(game=>game.GameId==gameId).FirstOrDefault();
            // ORIGINAL line
            //var game = scope.Database.Query<GameDto>().Where(game=>game.GameId==gameId).FirstOrDefault();
            scope.Complete();

            return game.FirstOrDefault();
        } catch (Exception ex) {
            Log.Error("Error fetching game from database "+ex);
            return null;
        }
    }
}

原来的行没有任何连接(GameDTO 是相同的,但没有外键),但现在我想加入这个。经过一番研究,得出的结论是我应该使用 Include 命令,但我收到各种错误关于那里的元素转换错误的消息。 也许我根本不需要包含,并且由于外键注释,一切都应该自动工作?

c# database join umbraco npoco
1个回答
0
投票

您可以编写一个查询来连接表

像这样:

var query = @"SELECT * FROM Table1 JOIN 
            Table2 ON Table2.Property = Table1.Property where Table1.Property  = @0"; 
var result = db.Single<Model>(query, Table1Property);

我在这里使用IDbFactory

© www.soinside.com 2019 - 2024. All rights reserved.