我正在尝试修复使用DataContext.ExecuteQuery执行sql语句的ASP.NET应用程序中的问题。查询包含以下部分:
LEFT OUTER JOIN dbo.Contacts ON dbo.Accounts.SalesRepId = dbo.Contacts.ContactId WHERE " + string.Join(" AND ", whereClauses) + @"
其中“whereClauses”是字符串列表。这样,在查询中实现了搜索功能。当为“O'Donnel”这样的字符串运行打开搜索时会出现问题,这显然会将查询运行到错误中。我被要求解决这个问题。我的方法是在查询中用“{0}”替换where语句,然后将其作为ExecuteQuery方法中的参数传递。我取得的成就是:
LEFT OUTER JOIN dbo.Contacts ON dbo.Accounts.SalesRepId = dbo.Contacts.ContactId {0}
var where = "WHERE 1=1";
_db.ExecuteQuery<AccountModel>(query, where)
但它不起作用?当我用一个参数替换整个部分时,一切都很好:
LEFT OUTER JOIN dbo.Contacts ON dbo.Accounts.SalesRepId = dbo.Contacts.ContactId WHERE 1={0}
var where = "1";
_db.ExecuteQuery<AccountModel>(query, where)
我的问题 - 是否可以将整个where语句动态注入DataContext.ExecuteQuery方法,或者我可以仅使用此方法传递特定参数?
答案 0 :(得分:0)
这是help page for the ExecuteQuery
method。
您无法将整个 where子句作为参数传递,因为select * from myTable @param
之类的查询不是有效的SQL,而select * from myTable where myField = @param
是有效的SQL。
因此,在回答您的具体问题时 - 不,您不能通过将参数传递给ExecuteQuery
来实现此目的。
但是,为什么不在将代码传递给ExecuteQuery
之前在代码中构建查询?
e.g。
var query = "select * from myTable where 1=1" + string.Join(" AND ", whereClauses);
var result = _db.ExecuteQuery<AccountModel>(query);