从SqlCommand对象返回一个列表 - 如何尽可能少地为数据库提供数据?

Sim*_*ely 2 .net c# sql sql-server sql-server-2008

我正在为我的班级写一个私人方法.我作为参数传递给这个整数列表,表示我的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对象,执行一次,遍历读者并将其保存在List中?这样做的最佳方式是什么?是否正在创建.dbml文件来表示非常繁忙的数据库错误做法?

Mar*_*ell 5

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

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

说,虽然是短小精悍将处理这个非常漂亮的你:

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

dapper将发现in @ids使用情况,并将其作为参数进行扩展,执行:

select Name from Table where ID in (@p__0, @p__1, @p__2)
Run Code Online (Sandbox Code Playgroud)

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

这给你:

  • 来电者方便
  • 呼叫者的表现(小巧玲珑)
  • 完整参数化
    • 允许在服务器上重新使用最佳查询计划

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

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