gpt4 book ai didi

linq - NHibernate LINQ 包含不起作用

转载 作者:行者123 更新时间:2023-12-05 01:31:24 24 4
gpt4 key购买 nike

我是 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 like ('%'||@p0||'%') 而不是 FirstName like ('%'+@p0+'%') 据我所知。

我使用的数据库是SQLServerCE,NHibernate版本是3.1.0

请帮助解决这个问题。

最佳答案

这是“Dialect.cs”文件(NH 的基本方言类)中 concat 函数的定义:

RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "||", ")"));

应该是

RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));

用于 SQL CE。所以你必须使用 MsSqlCe40Dialect 类。我认为它还没有在 fluent-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>() ...

关于linq - NHibernate LINQ 包含不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6491756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com