Почему Trim () не работает в этом выражении? - PullRequest
2 голосов
/ 14 сентября 2010

У меня есть следующий метод:

        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 ]

5 голосов
/ 14 сентября 2010

Попробуйте добавить справа значение, которое вы сравниваете, к требуемой длине, например:

string cmpValue = "IMA".PadRight(10);

var catIds = DetachedCriteria.For<Category>()
        .Add<Category>(c => c.TypeCode == cmpValue)
        .SetProjection(LambdaProjection.Property<Category>(s => s.Id));
2 голосов
/ 14 сентября 2010

Ребята из вашего офиса правы - провайдер linq не знает, как перевести C # string.Trim () в любой sql-вариант.

Что касается исправления, linq может заставить вас делать самые ужасные вещи - например, заполнение ваших данных, чтобы сопоставить CHAR (10), а не TRIM () с «нормальной» строкой.

0 голосов
/ 14 сентября 2010

Я надеюсь, что следующий код может решить вашу проблему:

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