Как сделать Linq LIKE или Contains, когда к обоим значениям добавлены строки

Я пытаюсь написать запрос Linq для поиска одного соответствующего значения в столбце базы данных, который представляет собой строку значений с разделителями-запятыми. Чтобы убедиться, что я не совпадаю с частью одного из этих значений или пропущу первое или последнее значение, я обычно добавляю запятую в начало и конец как цели, так и источника. К сожалению, это не работает с Linq, и я не понял, как использовать SqlMethods.Like в этом контексте. Мой код:

int totalItems = 0;

var userList = from r in db.User
               select r;

if (!string.IsNullOrEmpty(filter.department))
{
    userList = userList.Where(s => s.department.Contains(filter.department));
}
if (!string.IsNullOrEmpty(filter.role))
{
    // The following code that includes commas in the strings 
    // causes a runtime error regarding simple or enumerated objects:
    userList = userList.Where(
        r => (','+r.roles.Trim()+',').Contains(','+filter.role.Trim()+',')
    );

    // The following code works, but is not what I need to do the search properly:
    //userList = userList.Where(s => s.roles.Contains(filter.role));
}

totalItems = userList.Count(); // here is where the error actually occurs

Я бы не возражал против использования SqlMethods.Like, но не знаю, как его использовать при изменении такого запроса.


person Bruce Patin    schedule 06.03.2014    source источник
comment
можешь показать, как выглядят r.roles и filter.roles?   -  person Selman Genç    schedule 07.03.2014
comment
Какую именно ошибку вы получаете? Вам также, вероятно, следует использовать ","+r.roles.Trim()+"," (конкатенацию строк) вместо конкатенации символов. Это не имеет значения в обычном коде C#, но может быть проблематичным, когда поставщик запросов переводит ваш запрос в SQL.   -  person MarcinJuraszek    schedule 07.03.2014
comment
Пример: r.roles = Staff,Administrator; filter.roles = Администратор.   -  person Bruce Patin    schedule 21.03.2014


Ответы (1)


Попробуй это :

userList = userList.Where(
    r => (r.roles.Split(',')).Any(o => o == filter.role)
);
person bog500    schedule 11.03.2014