2010-10-29 4 views
2

Я конвертирую проект из использования linq2sql для использования источника odata. Я пытаюсь для поиска пользователя, как это ...LIKE in OData query

FrameworkEntities db = new FrameworkEntities(
    new Uri("http://localhost/odata/FrameworkService.svc")); 
User user = db.Users.Where(
    u => SqlMethods.Like(u.UserName, UserName)).FirstOrDefault(); 

, но я получаю ошибку «метод„Boolean Like (System.String, System.String)“не может быть использован на клиенте, это только для перевод на SQL. " Это было возможно в linq2sql, поэтому мне просто интересно, как я изменил бы это, чтобы он работал с сервисом odata. Я не нашел статей об этом.

ответ

2

Как и ошибка, SqlMethods.Like() предназначен для перевода в SQL. Запросы oData не переводятся на SQL, поэтому вы не можете использовать этот метод. Лучше всего использовать IndexOf с StringComparison.InvariantCultureIgnoreCase для эмуляции нечувствительной к регистру версии String.Contains.

О ... и вы можете объединить вызовы Where и FirstOrDefault :

User user = db.Users 
       .Where(u => u.UserName.IndexOf(Username, 
        StringComparison.InvariantCultureIgnoreCase) > 0) 
       .FirstOrDefault(); 
+0

@rushonerok - Модифицированный, чтобы соответствовать Вашему комментарий. –

0

OData действительно содержит функцию substringof. Для небольшого проекта, над которым я недавно работал, меня беспокоило, были ли данные «LIKE» строка в трех свойствах модели данных.

$filter=(IN_OUT eq '0' and (substringof('D20033', toupper(BENEFICIARY)) or substringof('D20033', toupper(ORIGINATOR)) or substringof('D20033', toupper(MEMO)))) 

Я также использовал функцию ToUpper вокруг свойств модели в сочетании с прописными буквами строки поиска формы входного сигнала, так что у меня регистронезависимый поиск. Поэтому здесь меня беспокоило, что IN_OUT является «0» и «D20033» в одном или нескольких из трех полей: BENEFICIARY, ORIGINATOR или MEMO.

0

В качестве альтернативы вы можете использовать выражения «startswith» в Odata.

Пример:

var query = context.Users; 
    query = query.AddQueryOption("$filter", String.Format("UserName startswith {0}", UserName)); 
    Users sers = new DataServiceCollection<User>(query); 

Это будет генерировать URI, как это: http://localhost:7048/OData/Users $ фильтр = UserName StartsWith 'Обама'

Ссылка: https://msdn.microsoft.com/en-us/library/hh169248(v=nav.80).aspx