c# - 带类型转换器的 OrmLite SQL 表达式查询

标签 c# servicestack ormlite-servicestack

我正在用一个小例子测试 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 表达式实现此行为吗?

最佳答案

默认情况下,类型化 SqlExpression 使用内联 SQL 而不是参数化查询,这会调用 TypeConverter 的 ToQuotedString() API。

您可以通过以下设置启用在 SQL Server 和 Oracle 的 SQL 表达式中使用参数化查询的预览支持:

OrmLiteConfig.UseParameterizeSqlExpressions = true;

关于c# - 带类型转换器的 OrmLite SQL 表达式查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34141224/

相关文章:

c# - 如何使用 ValidationGroup 和自定义验证创建控件?

C# Telegram Bot 。获取更新方法

c# - 当 ReplyTo 是临时队列时检索异常

c# - 如何对表和 View 使用相同的 DTO 外键关系

servicestack - JSONB - 按索引更新数组值

c# - 防止EF Code First继承TPT中的索引

c# - Identity 2.0 无效登录尝试

.net - 如何将 Servicestack 身份验证与 Active Directory/Windows 身份验证一起使用?

servicestack - 如何在 servicestack.net 中获取 HttpContext

sql-server - ServiceStack Ormlite 服务之间的事务