【问题标题】:SQL String format for Full Text Search in C# Entity FrameworkC# Entity Framework 中全文搜索的 SQL 字符串格式
【发布时间】:2017-12-21 03:00:24
【问题描述】:

我正在尝试创建一个参数化的 sql 字符串,当在数据库服务器上执行时,我希望以这种方式结束,执行时返回所需的结果:

SELECT * FROM OrderHeader WHERE FacilityId = 9 AND CONTAINS(*,'"Rich*"')

我已经尝试了下面的三个尝试和结果,但不能让它像上面的目标语句一样出现,结果要么是第一个语句中的 syntax error near '@p1',而后两个语句中的结果为零.

尝试 1:

string sql = "SELECT * " +
    "FROM OrderHeader " +
    "WHERE FacilityId = @p0 AND CONTAINS(*,\"@p1*\")";

var orderByCustomerFullTextQuery = base.DbSet.SqlQuery(sql, intFacilityId, strSearchTerm).AsQueryable();

exec sp_executesql N'SELECT * FROM OrderHeader WHERE FacilityId = @p0 AND CONTAINS(*,"@p1*")',N'@p0 int,@p1 nvarchar(4)',@p0=9,@p1=N'Rich'

尝试 2:

string sql = "SELECT * " +
    "FROM OrderHeader " +
    "WHERE FacilityId = @p0 AND CONTAINS(*,'\"@p1*\"')";

var orderByCustomerFullTextQuery = base.DbSet.SqlQuery(sql, intFacilityId, strSearchTerm).AsQueryable();

exec sp_executesql N'SELECT * FROM OrderHeader WHERE FacilityId = @p0 AND CONTAINS(*,''"@p1*"'')',N'@p0 int,@p1 nvarchar(4)',@p0=9,@p1=N'Rich'

尝试 3:

string sql = "SELECT * " +
    "FROM OrderHeader " +
    "WHERE FacilityId = @p0 AND CONTAINS(*,\'\"@p1*\"\')";

var orderByCustomerFullTextQuery = base.DbSet.SqlQuery(sql, intFacilityId, strSearchTerm).AsQueryable();

exec sp_executesql N'SELECT * FROM OrderHeader WHERE FacilityId = @p0 AND CONTAINS(*,''"@p1*"'')',N'@p0 int,@p1 nvarchar(4)',@p0=9,@p1=N'Rich'

【问题讨论】:

  • 我认为您需要从查询中完全删除 * 并将此 * 附加到您的参数中,请让我知道它是否可以作为答案发布
  • @msoliman 我是否可以假设您是在您删除答案时否决了我的问题的人?如果是这样,不酷。 Joel 首先让我找到了一个可行的解决方案,因此他的回答被接受了。虽然我认为你在正确的轨道上,你只是有点太晚了。
  • 我刚刚删除了我的答案,因为您验证了另一个答案是正确的并且与您合作得很好,所以我为什么还要保留我的答案,就是这样
  • @msoliman 明白,只是想知道为什么有人投反对票但没有解释原因。我一直在寻求改进我在 SO 上的问题,所以如果它有问题,我希望如果有人觉得足以反对它,他们会分享他们的原因,以便我可以改进。

标签: c# sql-server string entity-framework


【解决方案1】:

试试这个:

string sql = "SELECT * " +
    "FROM OrderHeader " +
    "WHERE FacilityId = @p0 AND CONTAINS(*,'\"' + @p1 + '*\"')";

其他尝试的问题是@p1 变量在sp_executesql 上下文中被评估为更大"@p1*" 字符串文字的一部分。它不是查询中的元素......只是字符串文字的一部分。我们可以将@p1 变量与完整的"@p1*" 值分开,方法是将其分成三个单独的部分:前导引号的文字,只是@p1,以及尾随通配符和引号的文字。它应该给你相当于执行这个查询:

SELECT * FROM OrderHeader WHERE FacilityId = 9 AND CONTAINS(*,'"' + 'Rich' + '*"')

如果做不到这一点(尽管它确实应该起作用),您还可以尝试在将值分配给参数时调整它们:

string sql = "SELECT * " +
    "FROM OrderHeader " +
    "WHERE FacilityId = @p0 AND CONTAINS(*, @p1)";

...SqlQuery(sql, intFacilityId, "\"" + strSearchTerm + "*\"").AsQueryable();

【讨论】:

  • 嗯,这是抛出一个incorrect syntax near '+' 错误
  • 你的最后一次编辑得到了与我相同的答案,但是@chad 提到它不适用于他
  • 你的第二个版本成功了!它呈现exec sp_executesql N'SELECT * FROM OrderHeader WHERE FacilityId = @p0 AND CONTAINS(*, @p1)',N'@p0 int,@p1 nvarchar(7)',@p0=9,@p1=N'"Rich*"'。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多