为了账号安全,请及时绑定邮箱和手机立即绑定

实体框架 -> 从数据库中一一获取记录或一次获取它们。哪个更快?

实体框架 -> 从数据库中一一获取记录或一次获取它们。哪个更快?

C#
猛跑小猪 2023-09-09 16:17:43
我收集了来自数据库中两个表的 Id。这两个对象都有一个我需要的共同属性。我将始终只选择此属性,但我的问题是:将 Id 的集合分成两部分并从数据库进行两个查询或使用循环并从数据库中一个接一个地获取每个对象是否更好?第一种方法List<byte[]> binariesToAttach = new List<byte[]>();IEnumerable<someObj> Type1objects = toAppend.Where(a => a.Type == FileType.Type1Obj).Select(f => f.Id);IEnumerable<someObj> Type2objects = toAppend.Where(a => a.Type == FileType.Type2Obj).Select(f => f.Id);binariesToAttach.AddRange(this.UnitOfWork.Example1Repository.Get(s => Type1objects.Any(a => s.Id == a)).Select(f => f.Content));binariesToAttach.AddRange(this.UnitOfWork.Example2Repository.Get(s => Type2objects.Any(a => s.Id == a)).Select(f => f.Content));foreach (var item in binariesToAttach){    // TODO something}或第二种方法:foreach (var item in toAppend){    if (item.Type == FileType.Type1Obj)    {        byte[] data = this.UnitOfWork.Example1Repository.Get(a => a.Id == item.Id).Select(a => a.Content).FirstOrDefault();        // TODO something    }    else    {        byte[] data = this.UnitOfWork.Example2Repository.Get(a => a.Id == item.Id).Select(a => a.Content).FirstOrDefault();        // TODO something    }}就我个人而言,我认为第二种方法更容易理解,这就是我更喜欢他的原因。但如果第一个更优化的话..
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

简短而简单的答案是,对于每次调用数据库,都需要执行多项操作,例如打开连接、身份验证、授权、关闭连接(可能我忘记了更多,但我不是 DBA,所以我'我对所采取的具体行动有点模糊)。

针对每个请求都会采取这些操作。您发出的请求越多,需要完成的工作就越多。如果请求量足够大,这种时间/精力就会严重消耗性能

因此,通常最好一次获取所有数据。这里可能存在一些情况例外,但您应该在尽可能少的请求中加载尽可能多的内容。


作为未来的一般提示:您可以通过编写一个小型控制台应用程序来轻松地自行进行基准测试,该应用程序可以一次或逐条获取 1000 行数据,并比较完成任一任务所需的时间。


顺便说一句,您的第一种方法存在问题。Any(a => a.Id == a.Id)总是true因为一个值总是等于它自己。我假设您添加的代码在实践中并未使用,而是更多地用于展示此问题的意图。


查看完整回答
反对 回复 2023-09-09
  • 1 回答
  • 0 关注
  • 47 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信