【问题标题】:Best practice to build dynamic SQL queries构建动态 SQL 查询的最佳实践
【发布时间】:2013-03-23 08:26:27
【问题描述】:

我正在寻找一些关于如何构建动态查询的提示和技巧。我有一个应用程序可以让用户在数据库表中搜索 10 个字段。根据 UI 中的哪些字段填充了一个值,查询应在数据库中的其他字段中搜索。

目前我正在尝试使用 StringBuilder 构建查询并添加 where 子句,但我真的不喜欢这样,我想知道是否有更好的方法来做到这一点,例如如果可能的话使用 LINQ。

也许有人可以提出想法或改进一些示例代码。谢谢,祝您有愉快的一天!

【问题讨论】:

  • 您要搜索多少数据,数百万条记录,成百上千条记录,您能否提供更多关于您希望进行的并发搜索的频率和数量的信息?
  • 并发搜索量会很低,这意味着一天只有 5 人每小时会进行几次查询。表中有大约 800.000 条记录。
  • 你可以看看这个 codeproject.com 文章。 codeproject.com/Articles/13419/…

标签: c# sql sql-server linq


【解决方案1】:

使用 LINQ 非常简单:

IQueryable<User> users = db.Users;

if(name != null) users = users.Where(u => u.Name == name);
if(dept != null) users = users.Where(u => u.Dept == dept);
...

var page = users.OrderBy(u => u.Name).Take(100).ToList();

每一个连续的Where组成带有更多过滤器的查询;正是你想要的。

对于原始 TSQL,StringBuilder 并非不合理;只要确保你完全参数化它。这可能意味着在每个术语中添加参数;例如:

...
if(name != null) {
    sql.Append(" and u.Name = @name");
    cmd.Parameters.AddWithValue("name", name);
}
if(dept != null) {
    sql.Append(" and u.Dept = @dept");
    cmd.Parameters.AddWithValue("dept", dept);
}
...

【讨论】:

  • 只是补充一点,以防有人对速度感到疑惑:Linq 的工作速度往往与存储过程一样快。但是,如果您需要较大的搜索速度,您应该考虑使用全文索引的视图。
  • 哇。是的,Linq 看起来真的很不错。它工作得很好。应该用我的代码更多地进入 Linq 世界。再次感谢!
  • @Haedrian 在大多数情况下,特别是因为这是一个相等搜索,标准的非聚集索引可以正常工作
猜你喜欢
  • 2015-10-18
  • 2013-01-06
  • 2018-11-12
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
相关资源
最近更新 更多