c# - 从 SqlCommand 对象返回一个列表——我怎样才能让数据库尽可能少地工作?

标签 c# .net sql sql-server sql-server-2008

我正在为我的类(class)写一个私有(private)方法。我将一个整数列表作为参数传递给它,代表我的 SQL Server 2008 表中一行的 ID。

我希望返回 List<string>"Name" (一列)在其中一个传入的整数等于 "ID" 的所有行上.所以如果我传入 List<int> {1, 2, 3 } .

我想本质上运行命令 (SELECT Name FROM Table WHERE ID = 1 OR ID = 2 OR ID = 3).ToList<string>() .

我正在使用的数据库非常繁忙,因此尽可能优化我的解决方案非常重要。考虑到这一点,我想知道使用 .dbml 文件创建到该数据库的链接并使用 Linq to SQL 查询数据库是否更好?

或者只是创建一个 SQLCommand 对象,执行一次,遍历读取器并将其保存在列表中?执行此操作的最佳方法是什么?正在创建 .dbml 文件来表示非常繁忙的数据库不良做法吗?

最佳答案

创建 .dbml 与服务器端性能关系不大;这改变了调用端的工具——但服务器不会真正注意到来自 .dbml 的命令与手工编码的命令之间的区别,至少:不是这么简单的事情(我应该注意,对于复杂的查询,手工编码查询通常可以胜过机器生成的查询)。

在调用方的性能方面; .dbml 只是一个包装器围绕 所有常用的命令/阅读器/等等——它不能使事情变得更快。在某些情况下,如果它不能很好地解析表达式,或者没有缓存解析的结果(就 TSQL 而言),它可能会变慢

不过,我说的是 dapper将为您很好地处理这个问题:

var ids = new List<int>{1,2,3};
var names = conn.Select<string>("select Name from Table where ID in @ids",
      new {ids}).ToList();

dapper 将发现 in @ids 用法,并将其扩展为参数,执行:

select Name from Table where ID in (@p__0, @p__1, @p__2)

(或类似的东西)- 传递 1、2 和 3 作为这些值。

这给你:

  • 来电者方便
  • 调用方的性能(dapper 已经过大量优化)
  • 全参数化
    • 允许在服务器上优化查询计划重用

更多一般,dapper 也会愉快地处理一般的实体映射,例如:

int id = 12345;
var customer = conn.Select<Customer>("select * from Custom where Id = @id",
    new { id }).Single();

关于c# - 从 SqlCommand 对象返回一个列表——我怎样才能让数据库尽可能少地工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11666309/

相关文章:

sql - 将sqlite中不同表的数据从一列复制到另一列

c# - 尝试绑定(bind) XAML 数据时出现异常

c# - WPF - 从代码隐藏/附加行为绑定(bind)到显式实现的接口(interface)属性

c# - Excel 的列带有点(.)

c# - 如何通过用户凭据访问 AD FS 声明?

c# - 如何使用 dotnet 格式在子文件夹中格式化整个项目?

sql - Qorus 嵌套选择哈希

php - 以可读/分层格式显示数组

c# - MySQL 更新查询错误消息 C#

c# - IIS 下的多个端点