EF Core :IQueryable的延迟执行

83 篇文章 0 订阅
35 篇文章 0 订阅

1、测试一下:只查询,但是不遍历IQueryable,查看是否有执行SQL语句。

2、在查询之后、foreach前后分别加上输出语句,查看输出内容的顺序。

3、发现:只有遍历IQueryable的时候才会执行。

输出的顺序:准备where   准备foreach   执行查询语句  完成foreach

什么是IQueryable

1、IQueryable只是代表一个“可以放到数据库服务器去执行的查询”,它没有立即执行,只是“可以被执行”而已。

2、对于IQueryable接口调用非终结方法的时候不会执行查询,而调用终结方法的时候则会立即执行查询。

3、终结方法:遍历、ToArray()、ToList()、Min()、Max()、Count()等;

4、非终结方法:GroupBy()、OrderBy()、Include()、Skip()、Take()等。

5、简单判断:一个方法的返回值类型如果是IQueryable类型,那么这个方法一般就是非终结方法,否则就是终结方法。

附: List泛型集合是C#编程中的经常使用的集合之一,相对数组它可以动态的添加元素而不是声明的时候就必须指定大小。相对于ArrayList集合和Hashtable集合的优势是其元素的数据类型可以确定。而不是默认的父类类型object。

为什么要延迟执行?

说白了就是,在你把最终结果取出来之前,EF要想写一个sql就完事了,不和你逼逼,一次性干完活。

1、可以在实际执行之前,分步构建IQueryable。

2、比如:定义一个方法根据给定的关键字searchWords来查询匹配的书;如果searchAll参数是true,则书名或者作者名中含有给定的searchWords都匹配,否则只匹配书名;如果orderByPrice参数为true,则按照价格排序,否则就自然排序;upperPrice参数代表价格上限。

void QueryBooks(string searchWords, bool searchAll, bool orderByPrice,double upperPrice)

3、试着传递不同参数,查看生成的SQL的不同。

 

private static void QueryBooks(string searchWords, bool searchAll, bool orderByPrice,double upperPrice)
{
	using (TestDbContext ctx = new TestDbContext())
	{
		IQueryable<Book> books = ctx.Books.Where(b=>b.Price<=upperPrice);
		if(searchAll)//匹配书名或、作者名
		{
			books = books.Where(b=>b.Title.Contains(searchWords)|| b.AuthorName.Contains(searchWords));
		}
		else//只匹配书名
		{
			books = books.Where(b => b.Title.Contains(searchWords));
		}
		if(orderByPrice)//按照价格排序
		{
			books = books.OrderBy(b=>b.Price);
		}
		foreach(Book b in books)
		{
			Console.WriteLine($"{b.Id},{b.Title},{b.Price},{b.AuthorName}");
		}
	}
}

结论 

IQueryable代表一个对数据库中数据进行查询的一个逻辑,这个查询是一个延迟查询。我们可以调用非终结方法向IQueryable中添加查询逻辑,当执行终结方法的时候才真正生成SQL语句来执行查询。

可以实现以前要靠SQL拼接实现的动态查询逻辑。

思考:对IQueryable的复用

1、IQueryable是一个待查询的逻辑,因此它是可以被重复使用的。

2、


IQueryable<Book> books = ctx.Books.Where(b => b.Price <= 8);
Console.WriteLine(books.Count());
Console.WriteLine(books.Max(b=>b.Price));
var books2 = books.Where(b=>b.PubTime.Year>2000);

有一说一这个🈵️有用的,似乎可以试试,减少代码重复量。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
EFCore是一个用于.NET平台的开源对象关系映射(ORM)框架,它提供了一种简化数据库访问的方式。与原生的ADO.Net相比,EFCore在内存消耗上较大,因为它会在内存中生成实体和数据库表的映射视图。然而,EFCore提供了各种扩展方法来支持增删改查,提高了开发效率。对于小型项目,使用原生的ADO.Net可能更加灵活,因为它允许编写灵活的SQL语句。但对于大型项目,使用EFCore可以减少编写SQL语句的工作量,并且在表结构变更时更加方便。EFCore还提供了事务支持,可以使用DbContext.Database.BeginTransaction方法开启事务,并使用Commit方法提交事务,Rollback方法回滚事务,Dispose方法销毁事务。使用Lambda表达式时需要引入System.Linq命名空间。在EFCore中进行数据查询可以使用AsEnumerable方法或AsQueryable方法将集合类型转换为IEnumerable类型或IQueryable类型。删除操作可以使用EFCore提供的删除方法进行操作。 #### 引用[.reference_title] - *1* *2* [C# EFCore学习总结](https://blog.csdn.net/qq_38192821/article/details/130604484)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C# EF Core可视化工具的使用以及EF Core入门语句](https://blog.csdn.net/qq_39935495/article/details/121599467)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值