【问题标题】:C# Expression to return TSQL Contains keywordC# 表达式返回 TSQL 包含关键字
【发布时间】:2014-05-30 16:33:25
【问题描述】:

我有以下代码:

public Expression FilterString(string property, string Value, ParameterExpression parameter)
{
    var getname = Expression.Property(parameter, property);

    var toLower = Expression.Call(getname, "ToLower", null, null);

    var contains = Expression.Call(toLower, "Contains", null, new[] { Expression.Constant(Value.ToString().ToLower()) });

    //This will result in "LOWER(Body) LIKE '%abc123% " but I need "CONTAINS(Body, 'abc123')"

    return contains;
}

var parameter = Expression.Parameter(typeof(Message), "message");
var expressionFilter = myclass.FilterString("Body","abc123", parameter);
var lambda = Expression.Lambda(expressionFilter, parameter);

//Apply lambda to EF query object
query = query.Where((Expression<Func<Message, bool>>)lambda);

这会产生一个 TSQL LIKE 语句,但我希望它执行一个 CONTAINS 语句。

无论如何我可以修改上面的FilterString 方法来做到这一点?

【问题讨论】:

  • Contains 不是 SQL99 的一部分——这就是为什么不包括在内。

标签: c# sql .net lambda expression-trees


【解决方案1】:

看起来你不能使用 vanilla EF,至少根据这里的来源:http://entityframework.codeplex.com/SourceControl/latest#src/EntityFramework/Core/Common/EntitySql/AST/BuiltInKind.cs

您必须将 Contains 添加到 AST 并生成它。 Here's a basic tutorial on DBProviders.

【讨论】:

  • 谢谢 AST 是什么意思?
【解决方案2】:

我意识到这并不是您想要的,但是您应该能够通过让自己跳出 LINQ 并直接查询数据库来轻松获得您想要的结果:

MyDbContext.Database
.SqlQuery<MyTable>("select * from [MyTable] where contains(Body, @p0), "abc123")

【讨论】:

  • 谢谢。我遇到的问题是我根据存储在数据库中的运算符、键和值(例如/Equals、Body、'abc')通过上述过滤器代码发送 IQueryable
猜你喜欢
  • 2019-05-26
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2012-12-08
  • 2023-02-09
  • 1970-01-01
相关资源
最近更新 更多