NHibernate 将本地日期年份和月份与日期集合进行比较
NHibernate compare local date year and month with collections of dates
我想做的是:
tradingObjectQueryOver.Where(
Restrictions
.On<OrderDealDto>(d => d.UnderlyingContractMaturity.Value.ToContractName())
.IsInG(filter.ContractDates.ToContractName()));
其中
public const string ContractNameFormat = "MMMyy";
public static string ToContractName(this LocalDate date)
{
return date.ToString(ContractNameFormat, UsCulture).ToUpper();
}
因此我不能调用 d.UnderlyingContractMaturity.Value.ToContractName() 因为 SQL 对像 ToString 这样的 c# 方法一无所知。解决此问题的最简单方法是什么,例如 TSQL 依赖函数?
new SQLFunctionTemplate(NHibernateUtil.String, "FORMAT(?1, 'yyyMM', 'us-US')");
但同时我不想降低性能,这只是查询的一小部分,数据库中有 100k-10m 元素的规模。
所以我最终在 sql 端使用了一个函数
ALTER FUNCTION [dbo].[f_ToContractName] (@date DATE)
RETURNS NVARCHAR(5)
AS
BEGIN
RETURN UPPER(REPLACE(RIGHT(CONVERT(VARCHAR(9),@date, 6), 6), ' ', ''))
END
我想做的是:
tradingObjectQueryOver.Where(
Restrictions
.On<OrderDealDto>(d => d.UnderlyingContractMaturity.Value.ToContractName())
.IsInG(filter.ContractDates.ToContractName()));
其中
public const string ContractNameFormat = "MMMyy";
public static string ToContractName(this LocalDate date)
{
return date.ToString(ContractNameFormat, UsCulture).ToUpper();
}
因此我不能调用 d.UnderlyingContractMaturity.Value.ToContractName() 因为 SQL 对像 ToString 这样的 c# 方法一无所知。解决此问题的最简单方法是什么,例如 TSQL 依赖函数?
new SQLFunctionTemplate(NHibernateUtil.String, "FORMAT(?1, 'yyyMM', 'us-US')");
但同时我不想降低性能,这只是查询的一小部分,数据库中有 100k-10m 元素的规模。
所以我最终在 sql 端使用了一个函数
ALTER FUNCTION [dbo].[f_ToContractName] (@date DATE)
RETURNS NVARCHAR(5)
AS
BEGIN
RETURN UPPER(REPLACE(RIGHT(CONVERT(VARCHAR(9),@date, 6), 6), ' ', ''))
END