在一个Linq to Entities查询中多次实现“like”运算符

时间:2010-09-07 16:24:43

标签: c# linq linq-to-entities expression sql-like

我们有一个字符串列表,我们需要按该列表过滤我们的结果。示例将找到所有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,
    ...
}

提供的代码here接近我们需要的代码,但是我们无法弄清楚如何使用Expression Class来实现我们需要的StartsWith。

2 个答案:

答案 0 :(得分:1)

嗯,你可以尝试这个:

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,
    ...
}

如果这不起作用,那么制作更通用的方法将没有任何用处:(

答案 1 :(得分:0)

如何使用复合语句,例如

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