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