我正在使用 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 命令,但我收到各种错误关于那里的元素转换错误的消息。 也许我根本不需要包含,并且由于外键注释,一切都应该自动工作?
您可以编写一个查询来连接表
像这样:
var query = @"SELECT * FROM Table1 JOIN
Table2 ON Table2.Property = Table1.Property where Table1.Property = @0";
var result = db.Single<Model>(query, Table1Property);
我在这里使用IDbFactory