Linq, Выражения, NHibernate и Как сравнение

На полученных платформах Windows CE нет никаких iostream с по умолчанию. Способ пойти существует preferaby с _itoa<> семья, обычно _itow<> (так как большая часть строкового материала является Unicode там так или иначе).

6
задан Agustin Meriles 25 March 2013 в 22:07
поделиться

4 ответа

Простой способ

Просто используйте

if (comparison == ComparisonType.StartsWith)
    query = query.Where(e => e.StringProperty.StartsWith("SearchString"));
else if ...

Сложный путь

Если вы хотите сделать что-то подобное, либо убедитесь, что вашему провайдеру LINQ можно каким-то образом сообщить об этом новом методе , и как он преобразуется в SQL (маловероятно), или предотвратить доступ вашего метода к поставщику LINQ и предоставить поставщику то, что он понимает (сложно). Например, вместо

query.Where(e => CompMethod(e.StringProperty, "SearchString", comparsionType))

вы можете создать что-то вроде

var query = source.WhereLike(e => e.StringProperty, "SearchString", comparsionType)

с помощью следующего кода

public enum ComparisonType { StartsWith, EndsWith, Contains }

public static class QueryableExtensions
{
    public static IQueryable<T> WhereLike<T>(
        this IQueryable<T> source,
        Expression<Func<T, string>> field, 
        string value,
        SelectedComparisonType comparisonType)
    {
        ParameterExpression p = field.Parameters[0];
        return source.Where(
            Expression.Lambda<Func<T, bool>>(
                Expression.Call(
                    field.Body, 
                    comparisonType.ToString(), 
                    null, 
                    Expression.Constant(value)),
            p));
    }
}

Таким образом вы даже можете добавить дополнительные критерии

var query = from e in source.WhereLike(
                e => e.StringProperty, "SearchString", comparsionType)
            where e.OtherProperty == 123
            orderby e.StringProperty
            select e;

Очень, очень сложный способ

Это было бы (технически) возможно чтобы переписать дерево выражений до того, как провайдер увидит его, чтобы вы могли использовать запрос, который вы изначально имели в виду, но вам нужно было бы

  • создать Where (этот IQueryable источник, выражение >
17
ответ дан 8 December 2019 в 13:48
поделиться

Похоже, вы должны захотеть использовать:

query = query.Where(
Entity.StringProperty.Contains("SearchString")
)

Это должно соответствовать:

WHERE StringProperty LIKE '%SearchString%'

Это также должно работать для более сложных масок поиска, таких как "Mr? Sm% th", но Мне еще не приходилось тестировать подобные поисковые строки.


ОБНОВЛЕНИЕ: на основе OPs edit

Похоже, что вы просите что-то вроде следующего:

   public enum SelectedComparsionType
    {
        StartsWith,
        EndsWith,
        Contains
    }

public static bool Like(this string searchString, string searchPattern, SelectedComparsionType searchType)
{
    switch (searchType)
    {
        case SelectedComparsionType.StartsWith:
            return searchString.StartsWith(searchPattern);
        case SelectedComparsionType.EndsWith:
            return searchString.EndsWith(searchPattern);
        case SelectedComparsionType.Contains:
        default:
            return searchString.Contains(searchPattern);
    }
}

Это позволит вам написать код, как вам нужно, например:

query = query.Where(
Entity.StringProperty.Like("SearchString", SelectedComparsionType.StartsWith)
)

Однако, лично , я бы заменил любое использование SelectedComparsionType прямым вызовом требуемой строковой функции. Т.е.

query = query.Where(
Entity.StringProperty.StartsWith("SearchString")
)

Так как это по-прежнему будет отображаться на запрос SQL «LIKE».

1
ответ дан 8 December 2019 в 13:48
поделиться

Для решения этой проблемы лучше использовать Regex .

-1
ответ дан 8 December 2019 в 13:48
поделиться

Это именно то, что я имел в виду, спасибо. У меня уже было написано нечто подобное, но это не переводилось на SQL. Например, это сработало, если я сделал это напрямую:

Entity.StringProperty.EndsWith("SearchString");

Это не сработало, если я использовал специальный метод:

CompMethod("BaseString","SearchString",SelectedComparsionType.EndsWith)

Я думаю, что это, вероятно, имеет какое-то отношение к оценке выражений, я просто не уверен, что.

0
ответ дан 8 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: