NHibernate使用错误的列类型进行LINQ包含查询(varchar to nvarchar)

时间:2014-08-27 11:19:37

标签: c# sql-server linq nhibernate linq-to-nhibernate

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

Lambda string as 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();

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

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

获取name1的调用将生成一个参数:

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

获取name2的调用将生成一个参数:

{{1}}

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

编辑:已确认NHibernate 4.0.0.GA版本中仍存在此相同的行为。

1 个答案:

答案 0 :(得分:0)

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

public void saveGifImage(Context context, byte[] bytes, String imgName ) { FileOutputStream fos = null; try { File externalStoragePublicDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File customDownloadDirectory = new File(externalStoragePublicDirectory, "Merry_Christmas"); if (!customDownloadDirectory.exists()) { boolean isFileMade = customDownloadDirectory.mkdirs(); } if (customDownloadDirectory.exists()) { File file = new File(customDownloadDirectory, imgName); fos = new FileOutputStream(file); fos.write(bytes); fos.flush(); fos.close(); if (file != null) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, file.getName()); values.put(MediaStore.Images.Media.DISPLAY_NAME, file.getName()); values.put(MediaStore.Images.Media.DESCRIPTION, ""); values.put(MediaStore.Images.Media.MIME_TYPE, "image/gif"); values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis()); values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis()); values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath()); ContentResolver contentResolver = context.getContentResolver(); contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); Toast.makeText(context, "Image saved to " + file.getAbsolutePath(), Toast.LENGTH_SHORT).show(); } } } catch (Exception e) { e.printStackTrace(); } } ,如果可行