Как да направите 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()+"," (конкатенация на низове) вместо конкатенация на char. Няма разлика в нормалния код на 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