代码之家  ›  专栏  ›  技术社区  ›  DaveDev

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

  •  2
  • DaveDev  · 技术社区  · 14 年前

    我有以下方法:

            var catIds = DetachedCriteria.For<Category>()
                .Add<Category>(c => c.TypeCode == "IMA")
                .SetProjection(LambdaProjection.Property<Category>(s => s.Id));
    

    nchar(10) . 我想 Trim()

            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()

    3 回复  |  直到 14 年前
        1
  •  5
  •   veljkoz Danko Valkov    14 年前

    string cmpValue = "IMA".PadRight(10);
    
    var catIds = DetachedCriteria.For<Category>()
            .Add<Category>(c => c.TypeCode == cmpValue)
            .SetProjection(LambdaProjection.Property<Category>(s => s.Id));
    
        2
  •  2
  •   Wyatt Barnett    14 年前

    你办公室的人是对的——linq提供商不知道如何翻译C#字符串。修剪()到任何sql变体。

        3
  •  0
  •   Siva Gopal    14 年前

    我希望以下代码可以解决您的问题:

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