EF 4.1 Linq谓词包含使用硬编码字符串但不使用字符串变量时生成所需的SQL

时间:2011-10-31 22:32:25

标签: entity-framework

我有这段代码:

string name ="M";
Expression<Func<Organization, bool>> getExpression1 = r => r.Name.Contains(name);
Expression<Func<Organization, bool>> getExpression2 = r => r.Name.Contains("M");

GetOrgListBy(getExpression); 
GetOrgListBy(getExpression2); 

public IEnumerable<Organization> GetOrgListBy(Expression<Func<Organization, bool>>   filter)
{
  return DataContext.Parties.OfType<Organization>().Where(filter).ToList();
}

问题: 我将一个简单的表达式传递给存储库函数 通过匹配传递的名称获得List<Organization>。 当我查看getExpression1的sql跟踪(使用字符串变量)时,表达式生成[Name] like plinq_variable sql语句 省略了%运算符。我的目的是生成一个 [Name] like '%' + plinq_variable + '%' sql语句

但是,当我使用getExpression2(硬编码字符串)时,表达式成功 生成[Name] like N'%M%' sql语句。

为什么不getExpression1生成%运算符? 如何在sql中生成%运算符,就像getExpression2一样?

1 个答案:

答案 0 :(得分:0)

第一个表达式转换为参数化SQL查询。 Where子句中的变量......

[Name] like plinq_variable

...设置为值

@plinq_variable=N'%M%'

执行查询时。第二个表达式转换为带有硬编码字符串文字的SQL查询:

[Name] like N'%M%'

然后直接执行此查询。

表达式和查询的结果是相同的。