OrmLite SQL 带有类型转换器的表达式查询

OrmLite SQL expression query with type converter

我正在用一个小例子测试 OrmLite 的一些特性,并且在使用类型转换器时发现 SQL 表达式 API 和原始 SQL 表达式之间存在不同的行为。

我有 2 个域 类:

public class Account : Entity
{
    public string Name { get; set; }
    public Money Balance { get; set; }
    public Currency Currency { get; set; }
}

public class Currency : Unit
{
    public string Name { get; set; }
    public string Symbol { get; set; }

    public Currency(string format)
    {
        this.format = format;
    }

    public static implicit operator string (Currency value)
    {
        return value.Symbol;
    }

    public static implicit operator Currency(string value)
    {
        switch (value)
        {
            case "EUR":
                return Euro;
            case "USD":
                return Dollar;
            default:
                throw new NotSupportedException();
        }
    }

    private static Currency euro = new Currency("{0:n2} €") { Name = "Euro", Symbol = "EUR" };
    private static Currency dollar = new Currency("${0:n2}") { Name = "Dollar", Symbol = "USD" };

    public static Currency Euro
    {
        get
        {
            return euro;
        }
    }

    public static Currency Dollar
    {
        get
        {
            return dollar;
        }
    }
}

A型转换器:

public class CurrencyConverter : OrmLiteConverter
{
    public override string ColumnDefinition { get { return "char(3)"; } }

    public override DbType DbType { get { return DbType.StringFixedLength; } }

    public override object ToDbValue(Type fieldType, object value)
    {
        return (value as Currency).Symbol;
    }

    public override object FromDbValue(Type fieldType, object value)
    {
        Currency currency = value as string;
        return currency;
    }
}

还有一个测试:

    [TestMethod]
    public void TestMethod()
    {
        var dbFactory = new OrmLiteConnectionFactory("Data Source=Server;Initial Catalog=Test;Integrated Security=True", SqlServerDialect.Provider);

        SqlServerDialect.Provider.RegisterConverter<Money>(new MoneyConverter());
        SqlServerDialect.Provider.RegisterConverter<Currency>(new CurrencyConverter());

        using (IDbConnection db = dbFactory.Open())
        {
            db.DropAndCreateTable<Account>();

            var account = new Account()
            {
                Name = "My account",
                Currency = Currency.Dollar,
                Balance = 200
            };

            db.Save(account);

            // Raw SQL get the correct value
            var result = db.Single<Account>("Currency = @currency", new { currency = Currency.Dollar });
            // SQL expression gets null
            var otherResult = db.Single<Account>(x => x.Currency == Currency.Dollar);
        }
    }

我希望在两个 Single 调用中收到相同的结果,但 SQL 表达式查询似乎没有使用类型转换器来获取参数值。

有什么方法可以用 SQL 表达式实现这种行为吗?

Typed SqlExpression 使用内联 SQL 而不是默认调用 TypeConverter 的参数化查询 ToQuotedString() API.

您可以改为启用对 SQL 表达式中参数化查询的预览支持,方法是 SQL Server 和 Oracle,方法是设置:

OrmLiteConfig.UseParameterizeSqlExpressions = true;