我有以下代码,需要5-8秒才能完成:
recent_items returnedData = (from d in db.recent_items
where d.item_number == scannerInput.Text.ToUpper()
select d).FirstOrDefault();其中,以下内容在不到半秒钟内执行:
string search = scannerInput.Text.ToUpper();
recent_items returnedData = (from d in db.recent_items
where d.item_number == search
select d).FirstOrDefault();世界上发生了什么事?
发布于 2018-05-17 14:37:18
造成差异的最可能原因是EF在从RDBMS检索所有行之后评估内存中的第一个条件。
微软文档介绍了关于客户端与服务器评估的以下内容
支持在客户端上评估的部分查询以及将其部分推送到数据库。应由数据库提供程序来确定查询的哪些部分将在数据库中计算。
您的EF提供程序无法将scannerInput.Text.ToUpper()发送给关系数据库管理系统进行评估,因此在从数据库中检索数据行之后,它会在内存中进行所有比较。此决定是正确的,因为EF DB提供程序不能假定对上述表达式的连续计算将产生相同的结果。
另一方面,第二个查询为查询使用了一个捕获的变量。在EF运行查询时,该变量的值保证保持不变,因此它继续在RDBMS端计算请求。
https://stackoverflow.com/questions/50393776
复制相似问题