【问题标题】:Implementing a "like" operator multiple times in one Linq to Entities query在一个 Linq to Entities 查询中多次实现“like”运算符
【发布时间】:2011-04-09 07:14:09
【问题描述】:

我们有一个字符串列表,我们需要通过该列表过滤我们的结果。例如,查找所有 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 类来实现我们需要的 StartsWith。

【问题讨论】:

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


    【解决方案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,
        ...
    }
    

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

    【讨论】:

    • 我无法编译代码。我得到错误“投影”是一个“变量”,但它被用作“方法”。我需要改变什么?
    • @johnnywhoop:哎呀。我回家后会解决的。
    • 是的,有效。创建一个表达式会使其更快吗?它看起来很慢,但它是可用的。
    • @johnnywhoop:看看生成的 SQL。 “看起来很慢”不是很准确......如果不查看 SQL,您无法真正了解发生了什么。
    【解决方案2】:

    如何使用复合语句,例如

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      相关资源
      最近更新 更多