xml地图|网站地图|网站标签 [设为首页] [加入收藏]
当前位置: 手机mg娱乐娱城官网 > 操作系统 > 正文

Count判断和取行操作

时间:2019-12-21 19:52来源:操作系统
有这么一种场景,用户输入一个字符串,根据这个字符串模糊查询出结果。而模糊查询的结果可能会有多个,正常的情形下结果是只有一个。以下是例子。我是用EF的,不顾这和EF并无主

有这么一种场景,用户输入一个字符串,根据这个字符串模糊查询出结果。而模糊查询的结果可能会有多个,正常的情形下结果是只有一个。以下是例子。我是用EF的,不顾这和EF并无主要关系,只是我的代码里用到了EF。实现有两种方式,一种是先查询所有结果,然后在内存中进行判断

items=context.ass_ba_item.Where(c=c.EntId==userModel.EntId(c.ItemCode.EndsWith(inputCode)||c.ItemBarCode.EndsWith(inputCode))).ToList();if(items.Count1)thrownewMessageErrorException("不是唯一的资产编码,请输入精确的资产编码!");varitem=items.FirstOrDefault();if(item==null)thrownewMessageErrorException(string.Format("没有找到此编码的资产信息:{0}",inputCode));

代码中可以看到,先ToList,然后内存中做判断,和取第一行的值,保证结果记录有且只有一行。但这种方式有个问题:边界条件不可控。即如果输入一个很短的编码,导致查出一堆数据,要将数据从数据库加载,这会导致性能的问题。当然我们也知道,这种边界条件属于可能会发生,但极少出现的情况,当然也有可能有人故意利用这个漏洞进行攻击,造成性能的大幅下降。还有一种方式,是稳健的方式。不要先ToList,Count判断和取行操作,分两次请求数据库。

items=context.ass_ba_item.Where(c=c.EntId==userModel.EntId(c.ItemCode.EndsWith(inputCode)||c.ItemBarCode.EndsWith(inputCode)));if(items.Count()1)thrownewMessageErrorException("不是唯一的资产编码,请输入精确的资产编码!");varitem=items.FirstOrDefault();if(item==null)thrownewMessageErrorException(string.Format("没有找到此编码的资产信息:{0}",inputCode));

我的判断是,如果从正常的操作看,99%的操作都会正确的取到第一条记录,那么反正要取第一条,我一次就取出来,然后进行内存处理,数据库压力更低,数据传输带宽低,性能更好。但它的问题也明显:边界条件控制不严。而后者,Count和FirstOrDefault两次请求,数据库性能稍差,但边界控制严谨。那么问题来了,如果论良好的编程方式,应该是哪一种?边界条件控制是否应排在较高的考虑位置?

编辑:操作系统 本文来源:Count判断和取行操作

关键词:

  • 上一篇:没有了
  • 下一篇:没有了