Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ:从一百万个项目中选择单个项目时最有效的Where条件_C#_Linq - Fatal编程技术网

C# LINQ:从一百万个项目中选择单个项目时最有效的Where条件

C# LINQ:从一百万个项目中选择单个项目时最有效的Where条件,c#,linq,C#,Linq,假设 数据库中大约有一百万个项目和一个存储过程 返回所有项目 在不更改存储过程的情况下,返回单个项的最有效where条件是什么 尝试: var item = db.GetInfo().Where(i => i.url == url).Select(i => i.ID).FirstOrDefault(); var item = db.GetInfo().Where(i => i.ProductType == 5 && i.url == url).Select(i

假设
数据库中大约有一百万个项目和一个存储过程 返回所有项目

在不更改存储过程的情况下,返回单个项的最有效where条件是什么

尝试

var item = db.GetInfo().Where(i => i.url == url).Select(i => i.ID).FirstOrDefault();
var item = db.GetInfo().Where(i => i.ProductType == 5 && i.url == url).Select(i => i.ID).FirstOrDefault();
返回单个项目的最有效where条件

假设SP“返回所有项”,如果您只需要第一个满足条件的项,那么只需使用
FirstOrDefault
。如果这样一个项目存在,它将在找到它的那一刻返回。最坏的情况是o(n)

这两个查询的效率都是o(n)如果在数据库中执行该查询,那么这些字段上的索引的存在会产生不同。例如,如果
ProductType
字段有一个索引,那么第二个查询将更有效

毫无疑问,更好的选择是,这将发生在数据库中,而不是内存中。。。但如果这一点无法改变

返回单个项目的最有效where条件

假设SP“返回所有项”,如果您只需要第一个满足条件的项,那么只需使用
FirstOrDefault
。如果这样一个项目存在,它将在找到它的那一刻返回。最坏的情况是o(n)

这两个查询的效率都是o(n)如果在数据库中执行该查询,那么这些字段上的索引的存在会产生不同。例如,如果
ProductType
字段有一个索引,那么第二个查询将更有效


毫无疑问,更好的选择是,这将发生在数据库中,而不是内存中。。。但是,如果无法更改,则数据此时在内存中,因此DB索引不相关。@DavidL:这两种方法都不使用索引。过滤器应用于存储过程的输出。那么您有一个返回数百万项的存储过程?我会把注意力集中在这一点上,而不是如何让你的where更多efficient@Servy当前位置我不会做出那种假设
db
意味着一个EF实例,它很可能是一个
IQueryable
@RobertHarvey:这不是一个假设。OP说这是一个“存储过程”。@DavidL此时数据在内存中,因此DB索引不相关。@DavidL:这两种方法都不使用索引。过滤器应用于存储过程的输出。那么您有一个返回数百万项的存储过程?我会把注意力集中在这一点上,而不是如何让你的where更多efficient@Servy当前位置我不会做出那种假设
db
意味着一个EF实例,它很可能是一个
IQueryable
@RobertHarvey:这不是一个假设。OP说它是一个“存储过程”。这是更快的,因为它有时可以提前退出,而无需迭代所有一百万条记录。但这与db.GetInfo().FirstOrDefault(i=>i.ProductType==5&&i.url==url)相比如何?.ID;是什么让这个效率降低了?对我来说,这就像是一个完整的编程课程,浓缩成几行。我感谢您的努力和对细节的关注@GiladGreen-发布半准备就绪的答案有其代价:)而且没有办法通知选民关于更改的信息-所以反对票会粘住(不是我的反对票-但很可能是)这会更快,因为它有时可以提前退出,而无需迭代所有百万条记录。但是这与db.GetInfo().FirstOrDefault相比如何呢(i=>i.ProductType==5&&i.url==url)?.ID;是什么让这变得不那么高效?对我来说,这就像是一个浓缩成几行的完整的编程课程。我感谢大家的努力和对细节的关注!@GiladGreen-发布半成品答案有其代价:)而且没有办法通知选民有关更改的信息-所以负面投票依然存在(不是我的反对票——但很可能是)
var item = db.GetInfo().FirstOrDefault(i => i.url == url)?.ID;
var item = db.GetInfo().FirstOrDefault(i => i.ProductType == 5 && i.url == url)?.ID