c# - 使用 Dapper 水合复杂对象
问题描述
我对此进行了一些挖掘,但我不太明白。我在一个对象上有一个 Microsoft.Extensions.Logging.EventId,我使用 Dapper 将 EventId 保留在我的数据库中。我使用了两列:EventId (int) 和 EventName (varchar(...))。但是,我不太清楚如何从两个数据库列中填充一个属性对象 (EventId)。
我尝试操纵我的 SQL 。.
SELECT <snip>…[EventId] AS [EventId.Id],[EventName] AS [EventId.Name] . . .
但这正如你所料。
所以,这是我的 xunit 测试:
[Fact]
public async Task EventName_Retrievable()
{
logger.Log(logLevel: LogLevel.Critical,
eventId: new EventId(10, "find me"),
exception: null,
state: "yes please",
formatter: (s, e) =>
{
return e?.Message ?? s;
});
var criteria = new LogQueryCriteria
{
MessageContains = "yes please"
};
var service = new LogQueryService(_fixture.ConnectionString, _factory, _performanceAgent);
var logs = await service.FindLogsAsync(criteria);
Assert.NotEmpty(logs);
Assert.Equal("find me", logs.Last().EventId.Name);
}
这证明此功能不起作用:
public async Task<IEnumerable<ILogItemOutbound>> FindLogsAsync(LogQueryCriteria criteria)
{
var pe = _performanceAgent?.Start($"{nameof(LogQueryService)}.{nameof(FindLogsAsync)}", PerformanceTrackingLevel.Low);
if (criteria == null) { criteria = new LogQueryCriteria(); }
IEnumerable<ILogItemOutbound> results = null;
var sql = $@"
{Constants.SELECT_LOGS}{ConstructWhereClause(criteria)} {ConstructOrderByClause(criteria)}
OFFSET {criteria.OffsetValue} ROWS FETCH NEXT {criteria.NumberPerPage} ROWS ONLY;";
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
results = await connection.QueryAsync<LogItemOutbound, EventId, LogItemOutbound>(sql: sql, commandType: System.Data.CommandType.Text,
map: (logItem, eventId) =>
{
logItem.EventId = eventId;
return logItem;
}
, splitOn: "EventId");
_performanceAgent?.Finish(pe);
}
return results ?? new List<ILogItemOutbound>();
}
您可以看到我尝试使用类似于此人的地图功能:https ://taylorhutchison.github.io/2016/03/23/dapper-orm-complex-queries.html ,但名称总是出现NULL,不管我的方法如何。
任何人都看到我要去哪里错了吗?
如果相关,这是我的 SQL:
internal const string SELECT_LOGS = @"
SET NOCOUNT ON;
SET DEADLOCK_PRIORITY NORMAL;
SELECT [GlobalId]
,[UtcTimestamp]
,[Message]
,[LogLevel]
,[LogLevelName]
,[Source]
,[UserIdentity]
,[SessionId]
,[EventId]
,[EventName]
FROM [dbo].[Logs]";
帮助总是受到赞赏。
五
解决方案
EventName 不会映射到 Event.Name
将您的 SQL 更改为
internal const string SELECT_LOGS = @"
SET NOCOUNT ON;
SET DEADLOCK_PRIORITY NORMAL;
SELECT [GlobalId]
,[UtcTimestamp]
,[Message]
,[LogLevel]
,[LogLevelName]
,[Source]
,[UserIdentity]
,[SessionId]
,[EventId] as Id
,[EventName] as Name
FROM [dbo].[Logs]";
和你的spliton: "Id"
推荐阅读
- nginx - 基于 $http_x_forwarded_for 的 nginx 拒绝
- assembly - 在汇编中,如何在不破坏任一操作数的情况下添加整数?
- reactjs - 如何在 react-three-fiber 中使用 GLTFExporter 导出多个不同的 3d 场景
- java - org.cyclonedx.exception.ParseException:com.fasterxml.jackson.core.JsonParseException:意外字符't'
- model-view-controller - D365 Dynamics Patch 中的 Odata v4 提供程序在更改选项集\枚举虚拟实体字段时失败
- struct - 使用 RC 嵌套结构的 Rust 依赖反转
- mdriven - VS2022 社区上的 MDriven 框架设置 - 'EcoVsPackage' 包未正确加载
- javascript - 循环颜色
- python - 如何在一天中的特定时间启动/停止功能?
- windows - 在 Windows 上使用 Powershell 删除 ShellIconOverlayIdentifiers