LINQ to SQL:ExecuteQuery在执行参数化查询时不起作用

问题描述:

ExecuteQuery中存在一个奇怪的问题,因为它在执行参数化查询时不起作用。LINQ to SQL:ExecuteQuery在执行参数化查询时不起作用

下返回1个记录:

db.ExecuteQuery<Member>(@"SELECT * 
          FROM Member 
          INNER JOIN aspnet_Users ON Member.user_id = aspnet_Users.UserId 
          WHERE [aspnet_Users].[UserName] = 'Marina2'"); 

然而,参数化的版本不返回任何结果:

db.ExecuteQuery<Member>(@"SELECT * 
          FROM Member 
          INNER JOIN aspnet_Users ON Member.user_id = aspnet_Users.UserId 
          WHERE [aspnet_Users].[UserName] = '{0}'", "Marina2"); 

我在做什么错?

+0

唉,发现问题了。这是围绕{0}的单引号。但是,我仍然想知道为什么会导致问题。 – ajbeaven 2010-05-27 04:46:47

+1

使用单引号会导致问题,因为如果需要,Linq to SQL正在确定参数的类型并将它们放入。因此不必担心是否添加它们。 – 2010-05-27 04:49:30

尝试:

db.ExecuteQuery<Member>(@"SELECT * 
    FROM Member 
    INNER JOIN aspnet_Users ON Member.user_id = aspnet_Users.UserId 
    WHERE [aspnet_Users].[UserName] = {0}", "Marina2"); 

通知,帕拉姆没有引号。 Linq to SQL会自动知道用引号格式化它。

作为每MSDN

的参数在查询文本通过使用由Console.WriteLine()和的String.Format()中使用的相同的卷曲数表示。实际上,String.Format()实际上是在您提供的查询字符串上调用的,用生成的参数名称(例如@ p0,@ p1 ...,@ p(n))替换花括号参数。

因此,如果您留下的引号内容与[Username] = '@p0'匹配,但您可以运行分析器并捕获确切的SQL来验证。