我想做的是:
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')");
但是同时我不想降低性能,这只是查询的很小一部分,db中的元素规模为100k-10m。
答案 0 :(得分:0)
所以我最终在sql端使用了一个函数
ALTER FUNCTION [dbo].[f_ToContractName] (@date DATE)
RETURNS NVARCHAR(5)
AS
BEGIN
RETURN UPPER(REPLACE(RIGHT(CONVERT(VARCHAR(9),@date, 6), 6), ' ', ''))
END