我是NHibernate的新手,并与FluentNhibernate合作开发一个新项目。在执行一个非常简单的linq查询时,我遇到了一个奇怪的问题。
查询1 - 效果很好
//Query 1
var customers = from customer in _session.Query<Customer>()
where customer.FirstName == "john"
select new
{
customer.FirstName,
customer.LastName
};
当执行以下查询2时,我收到错误“无法执行查询”
//Query 2.
var customers = from customer in _session.Query<Customer>()
where customer.FirstName.Contains("john")
select new
{
customer.FirstName,
customer.LastName
};
NH生成的查询是,
选择customer0_.FirstName为col_0_0_,customer0_.LastName为col_1_0_ 来自tblCustomer customer0_ customer0_.FirstName喜欢('%'|| @ p0 ||'%'); @ p0 ='john'
它生成 FirstName喜欢('%'|| @ p0 ||'%')而不是 FirstName喜欢('%'+ @ p0 +'%')我能理解。
我使用的数据库是SQLServerCE,NHibernate版本是3.1.0
请帮助解决此问题。
答案 0 :(得分:4)
这是“Dialect.cs”文件中的concat函数的定义(NH的基本方言类):
RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "||", ")"));
哪个应该是
RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));
用于SQL CE。 所以你必须使用MsSqlCe40Dialect类。 我认为它还没有在流畅的NHibernate中注册,所以你可以这样定义:
... MsSqlCeConfiguration.Standard
...
.Dialect<MsSqlCe40Dialect>();
还有其他缺失功能的补丁,等待批准: https://nhibernate.jira.com/browse/NH-2723 请投票!
在此期间,您可以创建自己的方言:
using NHibernate;
using NHibernate.Dialect;
using NHibernate.Dialect.Function;
namespace Test1
{
public class TempSqlCeDialect : MsSqlCeDialect
{
public TempSqlCeDialect()
{
RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));
}
}
}
然后你可以通过定义:
来使用它... MsSqlCeConfiguration.Standard.Dialect<TempSqlCeDialect>() ...