NHibernate为LINQ包含查询使用了错误的列类型(varchar到nvarchar)

本文关键字:类型 varchar nvarchar 错误 包含 LINQ 查询 NHibernate | 更新日期: 2023-09-27 18:19:31

我在针对SQL Server的NHibernate 3.3.3中遇到问题,该SQL Server使用NVARCHAR作为VARCHAR列的参数,用于从LINQ表达式中的string.Contains()函数创建的LIKE查询。我有Fluent映射,它告诉NHibernate列是VARCHAR,而基本的"=="比较确实使用了VARCHAR参数。

Lambda字符串中列出了一个可能的答案VARCHAR,但经过多次键入(无法复制/粘贴到我的开发环境中),我无法使用它。

以下是一个用于存储VARCHAR列的表:

CREATE TABLE Names (
   Id   INT         NOT NULL IDENTITY (1, 1) PRIMARY KEY,
   Name VARCHAR(20) NOT NULL
);

以下是一些代码狙击来说明正在发生的事情:

public class Names
{
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
}
public class NamesMap : ClassMap<Names>
{
   Table("Names");
   Id(x => x.Id).Column("Id").GeneratedBy.Identity();
   Map(x => x.Name).Column("Name").CustomType("AnsiString");
}
// _namesRepository is an IQueryable to the name collection
var matchName = "fred";
var name1 = _namesRepository.Where(o => o.Name == matchName).FirstOrDefault();
var name2 = _namesRepository.Where(o => o.Name.Contains(matchName)).FirstOrDefault();

调用getname1将生成一个参数:

DECLARE @p0 varchar(8000) = 'fred';

调用getname2将生成一个参数:

DECLARE @p0 nvarchar(8000) = N'fred';

有人想出一个可行的解决方案来让LINQ字符串函数调用将参数映射到正确的类型吗?

编辑:已经确认,同样的行为仍然存在于NHibernate 4.0.0.GA版本中。

NHibernate为LINQ包含查询使用了错误的列类型(varchar到nvarchar)

我还没有准备好项目,所以我无法验证,但请检查您是否可以指定

Map(x => x.Name).Column("Name").SqlType("varchar(20)");以及它是否工作