На полученных платформах Windows CE нет никаких iostream
с по умолчанию. Способ пойти существует preferaby с _itoa<>
семья, обычно _itow<>
(так как большая часть строкового материала является Unicode там так или иначе).
Простой способ
Просто используйте
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 источник, выражение >
Похоже, вы должны захотеть использовать:
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».
Для решения этой проблемы лучше использовать Regex .
Это именно то, что я имел в виду, спасибо. У меня уже было написано нечто подобное, но это не переводилось на SQL. Например, это сработало, если я сделал это напрямую:
Entity.StringProperty.EndsWith("SearchString");
Это не сработало, если я использовал специальный метод:
CompMethod("BaseString","SearchString",SelectedComparsionType.EndsWith)
Я думаю, что это, вероятно, имеет какое-то отношение к оценке выражений, я просто не уверен, что.