表结构描述:一个文章带有多个评论,现在想输出所有,评论中带“微软”的文章。换句话说开,只要这个文章中的评论带这个词,就放入集合中去。
基于EF Core的实体间关系配置,我们不仅可以让数据的插入、获取等变得非常方便,而且让基于关系的过滤条件的时间也变得非常简单。
(where相当于条件过滤)
ctx.Articles.Where(a=>a.Comments.Any(c=>c.Message.Contains("微软")));
其底层的sql语句:

变换成另一种写法。
- ctx.Comments.Where(c => c.Message.Contains("微软"))
- .Select(c => c.Article).Distinct();
(SELECT DISTINCT 排除重复 表示查询结果中,去掉了重复的行)
其底层的sql,用join来实现:

同样效果的代码可能有多种写法,有时候要关注底层的SQL,看哪种方式最好。
区分IEnumerable和IQueryable
1、对普通集合和DbSet调用的Where方法,虽然用起来一样,但是“转到定义”后看到的是不同的方法。
2、普通集合的版本(IEnumerable)是在内存中过滤(客户端评估),而IQueryable版本则是把查询操作翻译成SQL语句(服务器端评估)。
IQueryable实现了IEnumerable接口
