为什么Trim()在这个表达式中失败了?

时间:2010-09-14 16:04:43

标签: c# nhibernate trim

我有以下方法:

        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(或沿着这些行的东西)。任何人都可以建议我如何解决这个问题?

3 个答案:

答案 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));