我有以下方法:
var catIds = DetachedCriteria.For<Category>()
.Add<Category>(c => c.TypeCode == "IMA")
.SetProjection(LambdaProjection.Property<Category>(s => s.Id));
这没有返回任何内容,因为在数据库中该字段为nchar(10)
。我想Trim()
TypeCode值,如下所示:
var catIds = DetachedCriteria.For<Category>()
.Add<Category>(c => c.TypeCode.Trim() == "IMA")
.SetProjection(LambdaProjection.Property<Category>(s => s.Id));
但它返回NHibernate错误:
Unrecognised method call in epression c.TypeCode.Trim()
办公室里的其中一个人认为这是因为HHibernate不知道如何将.Trim()
转换为SQL(或沿着这些行的东西)。任何人都可以建议我如何解决这个问题?
答案 0 :(得分:5)
尝试右键填充您要与所需长度进行比较的值,例如:
string cmpValue = "IMA".PadRight(10);
var catIds = DetachedCriteria.For<Category>()
.Add<Category>(c => c.TypeCode == cmpValue)
.SetProjection(LambdaProjection.Property<Category>(s => s.Id));
答案 1 :(得分:2)
你的办公室人员是正确的 - linq提供者不知道如何将C#string.Trim()转换为它的任何sql变种。
至于修复,linq可以让你做最严厉的事情 - 比如将数据填充到CHAR(10)而不是TRIM()到'普通'字符串。
答案 2 :(得分:0)
我希望以下代码可以解决您的问题:
Func<string, string> trimmer = (x) => {
return !string.IsNullOrEmpty(x) ? x.Trim() : string.Empty; };
然后像:
一样使用它var catIds = DetachedCriteria.For<Category>()
.Add<Category>(c => trimmer(c.TypeCode) == "IMA")
.SetProjection(LambdaProjection.Property<Category>(s => s.Id));