1

我正在尝试按照此处显示的拦截示例使其与 EF 6 一起使用,但遇到了RewriteFullTextQuery如图 1 所示的函数问题。拦截似乎有效,但实际上并未执行for循环中的逻辑RewriteFullTextQuery方法,因为cmd.Parameters.Count总是为零。此外,该cmd.CommandText属性似乎正在显示正确的 SQL 查询,我将其作为拦截工作正常的另一证据。

图 1:RewriteFullTextQuery 代码摘录

 public static void RewriteFullTextQuery(DbCommand cmd)
    {
        string text = cmd.CommandText;
        for (int i = 0; i < cmd.Parameters.Count; i++)
        {
            DbParameter parameter = cmd.Parameters[i];
            if (parameter.DbType.In(DbType.String, DbType.AnsiString, DbType.StringFixedLength, DbType.AnsiStringFixedLength))
            {

RewriteFullTextQuery 函数被ReaderExecuting图 2 中所示的函数调用,该函数为其提供了导致所有问题的命令参数。

图 2:ReaderExecuting 函数

public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        RewriteFullTextQuery(command);
    }

尽管我的代码与示例不完全相同,但拦截似乎正在工作,所以这让我想知道是什么条件将填充命令的 aParameters.Count大于零?

4

2 回答 2

1

事实证明,这是因为 Entity Framework 生成 SQL 的方式。如果将字符串文字作为搜索值传递给 LINQ 语句,它不会生成使用参数的 SQL。但是,如果您将搜索值作为变量传递,它将生成使用参数的 SQL。可以在此博客上找到解决方案(用于动态查询)和更多详细信息。

于 2016-09-22T20:39:59.847 回答
1

仅当您将参数作为变量传递给查询时,它才有效。如果您使用文字 EF 将不会使用参数。
我的意思是,这不会生成任何参数

context.Notes.Where(_ => _.NoteText == "CompareValue").Count();

这将

string compareValue = "CompareValue";
context.Notes.Where(_ => _.NoteText == compareValue).Count();
于 2016-09-22T18:33:02.943 回答