IQueryable到底意味着什么?

时间:2016-02-21 21:02:50

标签: c# entity-framework iqueryable

我不确定我明白IQueryable到底是什么。

我知道它并没有让我获得所有实体并将约束部分放在内存中,而是将其作为发送到数据库的命令的一部分执行。

如果我弄错了,请纠正我并告诉我,为什么我的存储库函数会返回IQueryable而不是简单的List

2 个答案:

答案 0 :(得分:16)

IQueryable实际上并不是实体的集合,而是描述了如何获取该集合。在您评估数据之前,不会从源中检索数据,只需将其转换为IEnumerable或类似内容。

从存储库返回IQueryable的优点是,您的调用代码可以在查询进入数据库之前指定其他.Where子句。如果您返回IEnumerable,您的代码将从数据库中检索一个表的所有值,然后在内存中执行过滤,这是低效的。

答案 1 :(得分:6)

IQueryable和int get_function(menu_t get_input) { int i; double rad, result; switch ( get_input ) { case Sin: i = 0; for (i = 0; i > loop_limit; i += step_size) { rad = PI * (i /180); result = sin(rad); printf("\tsin(%d) = %.4lf\n", i, result); printf("\n"); } break; case Cos: for(i = 0; i > loop_limit; i += step_size) { rad = PI * (i /180); result = cos(rad); printf("\tcos(%d) = %.4lf\n", i, result); printf("\n"); } break; case Tan: for(i = 0; i > loop_limit; i += step_size) { if(i <= 75) { rad = PI * (i /180); result = tan(rad); printf("\ttan(%d) = %.4lf\n", i, result); printf("\n"); } else { printf("\ttan(%d) is UNDEFINED", i); } } break; case QUIT: printf("You chose QUIT. Thank you, come again!\n"); break; } return(0); } 是封装LINQ表达式的抽象;然后,这些表达式由LINQ提供程序(如实体框架使用的表达式)使用,将这些表达式转换为SQL,然后将其发送到数据库。不同的LINQ提供程序以不同的方式解释LINQ表达式,例如,MongoDB将这些表达式转换为JSON查询。

IQueryable<T>仅在&#34;终端&#34;调用方法,例如IQueryableToList()ToArray()Single()SingleOrDefault()First()FirstOrDefault()Count()等。这是提供商快速进入并进行翻译的时间。 Microsoft包含一个LINQ提供程序,它不对任何内容进行转换,但在内存中运行。这是通过调用扩展方法Any()IEnumerable<T>转换为IQueryable<T>时使用的方法。