I have a simple GET service defined, which generates a different and incorrect SQL when I use it internally from C#. I am using MSSQL 2022 and ServiceStack 8.8.1 under MS Windows.
-- Correct: only uses AttachedId param
-- Called using Swagger
-- OrmLiteUtils_PrintSql
SQL: SELECT "Id", "AttachedId", "AttachedSource", "RichContent", "Closed", "DataEventRv", "DataEventId", "DataEventOn", "DataEventBy"
FROM "Attachment"."Note"
WHERE "Attachment"."Note"."AttachedId" = @0
PARAMS: @0=2ce5b8c5-cc9e-f011-a108-30138b721afe
-- Incorrect: should not be using DataEventRv param
-- Called internally in C# code
using var db = autoQuery.GetDb<Note>(Request);
var find = new GetNote { AttachedId = request.AttachedId };
var q = autoQuery.CreateQuery(find, Request);
var result = autoQuery.Execute(find, q, Request);
-- OrmLiteUtils_PrintSql
SQL: SELECT "Id", "AttachedId", "AttachedSource", "RichContent", "Closed", "DataEventRv", "DataEventId", "DataEventOn", "DataEventBy"
FROM "Attachment"."Note"
WHERE "Attachment"."Note"."AttachedId" = @0 AND "Attachment"."Note"."DataEventRv" = @1
PARAMS: @0=2ce5b8c5-cc9e-f011-a108-30138b721afe, @1=318001
using var db = autoQuery.GetDb<Note>(Request);
var find = new GetNote { AttachedId = request.AttachedId };
var q = autoQuery.CreateQuery(find, Request);
var result = autoQuery.Execute(find, q, Request);
The relevant definitions are:
// ServiceModel
[Route("/api/attachment/note", "GET")]
public class GetNote : QueryDb<Note>, IGet
{
public Guid? Id { get; init; }
public Guid? AttachedId { get; init; }
}
// Type
[Schema("Attachment")]
[DataContract]
public record Note : MriAuditBase
{
[AutoId]
[DataMember, Required]
public Guid Id { get; init; }
[DataMember, Required]
public Guid AttachedId { get; init; }
[DataMember, Required]
public string AttachedSource { get; init; } = null!;
[DataMember, Required]
public string RichContent { get; set; } = null!;
[IgnoreOnInsert, IgnoreOnUpdate]
[DataMember, Required]
public bool Closed { get; init; }
[Alias("DataEventRv")]
[DataMember, Required]
public ulong RowVersion { get; init; }
}
// Audit relevant columns in tables
public interface IAudit
{
byte DataEventId { get; set; }
DateTime DataEventOn { get; set; }
Guid DataEventBy { get; set; }
}
//Use as base record for Types persisted in audited database tables
public abstract record MriAuditBase : IAudit
{
[Required] public byte DataEventId { get; set; }
[Required] public DateTime DataEventOn { get; set; }
[Required] public Guid DataEventBy { get; set; }
}
public enum DataEventType : byte
{
Created = 1,
Modified = 2,
Deleted = 3
}
Any ideas why the DataEventRv is being used a select parameter?