DataContext.ExecuteQuery可以处理整个where语句

时间:2014-02-06 10:37:51

标签: c# sql tsql linq-to-sql executequery

我正在尝试修复使用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方法,或者我可以仅使用此方法传递特定参数?

1 个答案:

答案 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);