【问题标题】:Dynamic Linq to add LIKE to where clause动态 Linq 将 LIKE 添加到 where 子句
【发布时间】:2014-05-12 16:02:26
【问题描述】:

我正在尝试在实体查询中执行 LIKE 子句。 examples 我见过使用动态 linq 来做这种事情,但是我的代码......

var query = context.StudySet
    .Where("it.PatientName LIKE @patientName", new ObjectParameter("patientName", patientName);

...用

给我一个 System.Linq.Dynamic.ParseException
Additional information: Expression of type 'Boolean' expected

context 是 EF 6 代码优先的 DbContext,patientName 是字符串

请告诉我我的代码有什么问题?

【问题讨论】:

  • 如果不使用动态 LINQ,var query = context.StudySet.Where((it) => it.PatientName.Contains(patientName)) 之类的东西不适合你吗?
  • patientName 的值将来自一个采用通配符的搜索框。我想我可以拆分字符串并构建一个结合 StartsWith、Contains、EndsWith 等的查询。我只是认为 LIKE 代码少了一点。
  • 说的有道理,拆分听起来一点都不好玩!也许SqlMethods.Like 会起作用,就像this answer 一样?只是不确定它是否适用于 EF。
  • 不,对,它不起作用,不幸的是它只是 Linq to SQL。
  • 对不起 - 我想我正在走你已经走过的路!使用SqlQuery 和原始SQL 怎么样,比如var query = context.StudySet.SqlQuery("select * from StudySet where PatientName LIKE @patientName", new SqlParameter("@patientName", patientName));

标签: linq entity-framework dynamic-linq


【解决方案1】:

如果你想使用 DynamicLINQ,你需要像这样改变你的代码

var query = context.StudySet.Where("it.PatientName.Contains(@0)", patientName);

因为 DynamicLinq 无法解析 LIKE 运算符

【讨论】:

  • LIKE 应该是supported。我不必使用 Dynamic Linq,我想做一个 LIKE。包含 != LIKE(见上文)。
  • @nopskazoid eSQL 不一样 DynamicLINQ :-) 可能您需要更改问题标签
【解决方案2】:

我已经意识到我的错误了。

我曾假设传递查询的方法是 Dynamic Linq 的一部分,但实际上它只是 ObjectQuery 上标准 Where 方法的一种变体。如果我从我的(代码优先)DbContext 中获得 ObjectContext,那就太好了。

ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
ObjectSet<Study> studySet = objectContext.CreateObjectSet<Study>();

var query = studySet.
    Where("it.PatientName LIKE @patientName", new ObjectParameter("patientName", patientName));

【讨论】:

  • 这是强大而灵活的。谢谢。
【解决方案3】:

我不知道如何将 like 用于 LINQ 查询,但您可以使用原始 SQL 查询:

var query = context.StudySet.SqlQuery(
    "select * from StudySet where PatientName LIKE @patientName",
    new SqlParameter("@patientName", patientName));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2010-10-21
    • 2020-09-27
    相关资源
    最近更新 更多