Реализация оператора «Like» несколько раз в одном запросе Linq to Entities - PullRequest
2 голосов
/ 07 сентября 2010

У нас есть список строк, и нам нужно отфильтровать результаты по этому списку. Примером может быть поиск всех студентов, которые имеют SSN, которые начинаются с 465, 496 или 497 (плюс x больше)

List<string> list = GetPossibleStartsWithValues();
var qry = from student in entities.Students.WhereStartsWith(x=>x.SSN, list)
select new SearchedStudent
{
    Name = student.Name,
    SSN = student.SSN,
    ...
}

Код, предоставленный здесь , близок к тому, что нам нужно, но мы не можем понять, как реализовать StartsWith нам нужно с помощью класса выражений.

Ответы [ 2 ]

1 голос
/ 07 сентября 2010

Ну, вы могли бы попробовать это:

public static IQueryable<T> WhereStartsWith<T>(this IQueryable<T> source,
    Expression<Func<T, string>> projection,
    List<T> list)
{
    return source.Where(x => list.Any(y => projection(x).StartsWith(y)));
}

Это может не сработать, но стоило бы попробовать, прежде чем углубляться во что-то более сложное.

РЕДАКТИРОВАТЬ: Как вы говорите, вышесказанное не скомпилируется - вам нужно построить дерево выражений, представляющее бит в предложении Where.К сожалению.Однако, прежде чем вы начнете это делать, стоит посмотреть, сработает ли это в конце концов.Попробуйте это:

List<string> list = GetPossibleStartsWithValues();
var qry = from student in entities.Students
     .Where(student => list.Any(y => student.SSN.StartsWith(y)))
select new SearchedStudent
{
    Name = student.Name,
    SSN = student.SSN,
    ...
}

Если это не сработает, тогда создание более общего метода не поможет: (

0 голосов
/ 07 сентября 2010

Как насчет использования составного оператора, такого как

var qry = from student in entities.Students.Where( 
             s => list.Where( x => s.StartsWith(x)).Count() != 0 )
...