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;
我正在用一个小例子测试 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;