关于linq Where中的”或者“运算只查询出来满足一种条件的数据的问题,本质是IEnumerable和IQuerable之间的区别
如下代码所示,其中的"query"返回值类型为IQuerable
var query = _deviceRepository.GetAll().AsNoTracking()
.Where(a=>a.status = 1);
if(ture){
query = query.Where(a=>(a.name == "a" && a.sex = 1 ) || a.name == "b" );
}
var data = query.ToList();
此时,在Where中进行"或者"运算,"||" 左右两边只查询出来了一种条件的数据。
而如下代码所示,在拼接新的Where条件时,进行了ToList(),这个时候query的返回值类型为IEnumerable
var query = _deviceRepository.GetAll().AsNoTracking()
.Where(a=>a.status = 1).ToList();
if(ture){
query = query.Where(a=>(a.name == "a" && a.sex = 1 ) || a.name == "b" ).ToList();
}
var data = query;
此时,query拼接的Where将满足 "||" 两边的条件的数据都查询了出来。
关于IQuerable和IEnumerable之间的区别如下:
在使用IQueryable
和IEnumerable
的Where
方法进行“或者”运算时,存在一些区别。
延迟执行:
IQueryable
使用延迟执行,而IEnumerable
则立即执行。延迟执行意味着IQueryable
中的查询不会立即执行,直到实际需要结果时才会执行。这对于数据库查询非常有用,因为可以构建一个包含多个筛选条件的查询,然后将其发送到数据库执行。而IEnumerable
会立即执行查询,因此它无法将查询传递给数据库进行优化处理。数据库查询优化:
IQueryable
能够利用提供程序(例如Entity Framework)的功能,将Where
条件转换为底层数据库的查询语句。这样可以在数据库层面进行优化,仅返回满足条件的结果。而IEnumerable
只是在内存中对集合进行迭代,它不会将查询转换为数据库查询语句。过滤的位置:使用
IQueryable
进行“或者”运算时,筛选条件会应用于数据库查询,因此数据库只返回满足条件的结果。而在IEnumerable
中使用Where
进行“或者”运算时,所有数据都将加载到内存中,然后再进行筛选。这可能会导致性能问题,尤其是当处理大量数据时。
综上所述,使用IQueryable
进行“或者”运算更适合于数据库查询,它可以利用数据库的优化和延迟执行的特性。而IEnumerable
适用于在内存中对集合进行简单的筛选操作,不涉及数据库查询优化。
关于linq Where中的”或者“运算只查询出来满足一种条件的数据的问题,本质是IEnumerable和IQuerable之间的区别的更多相关文章
- iOS中NSNotification、delegate、KVO三者之间的区别与联系?
前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在网上看到一个博客上详细 ...
- 妥协与取舍,解构C#中的小数运算
题外话 正文开始之前,我首先要感谢博客园提供的这个优秀的平台.通过在这个优秀的平台上和很多志同道合的朋友交流,互相帮助,我也很荣幸的获得了15年的微软MVP的奖项.也使我更加坚信了代码改变世界.感激! ...
- 【微信小程序】 小程序中的递归运算/二分查找算法/Maximum call stack size exceeded
摘要: 小程序中的递归运算/二分查找算法/Maximum call stack size exceeded 场景:最近做一个车贷计算器, 其中存在一个公式如下: /**** 总金额 * 月利率 * ( ...
- Shell基础(二):Shell中的数值运算、条件测试操作、使用if选择结构
一.Shell中的数值运算 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 使用expr.$[ ].let等整数运算工具:定义变量X=1234,然后计算X与78 ...
- 深入研究js中的位运算及用法
什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的.由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并且借助位运算有时我们还能实现更简单的程序 ...
- 聊聊 C 语言中的 sizeof 运算
聊聊 sizeof 运算 在这两次的课上,同学们已经学到了数组了.下面几节课,应该就会学习到指针.这个速度的确是很快的. 对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力. 先说一个概念叫内 ...
- LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别
LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别 在写LINQ语句的时候,往往会看到.AsEnumerable() 和 .AsQueryable() .例如: s ...
- Java中的递归运算
Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...
- PHP中的位运算与位移运算(其它语言通用)
/* PHP中的位运算与位移运算 ======================= 二进制Binary:0,1 逢二进1,易于电子信号的传输 原码.反码.补码 二进制最高位是符号位:0为正数,1为负数( ...
- 【编程题目】在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。
第 17 题(字符串):题目:在一个字符串中找到第一个只出现一次的字符.如输入 abaccdeff,则输出 b. 思路:此题非常容易. 最开始是想开辟一块空间存储每个字符出现的次数. 但转念一想,似乎 ...
随机推荐
- 这可能是最全面的TCP面试八股文了
计算机网络基础,考验一个程序员的基本功,也能更快的筛选出更优秀的人才. 说说TCP的三次握手 假设发送端为客户端,接收端为服务端.开始时客户端和服务端的状态都是CLOSED. 第一次握手:客户端向服务 ...
- python实现员工信息表
学习python时,看到的一个题目第一次写博客, 有误的地方还请大佬们指正,十分感谢~要求如下'''文件存储格式如下:id,name,age,phone,job(这行不需要写)1,alice,22,1 ...
- CVE-2022-21454:漏洞整改mysql5.7.37升级至5.7.38 tar包升级
问题描述:对数据库服务器进行漏扫,发现一些中高位漏洞需要整改,有些数据库需要升级到最新版 漏洞修改指导链接:https://www.oracle.com/security-alerts/cpuapr2 ...
- iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践
作者:京东零售 姜海 灵动岛是苹果在iPhone 14 Pro和iPhone 14 Pro Max上首次提出的全新UI交互形式,创新性的让虚拟软件和硬件的交互变得更为流畅.当有来电.短信等通知时,灵动 ...
- Cron表达式介绍与示例
1. 概念介绍 Cron表达式是一个具有时间含义的字符串,字符串以5~6个空格隔开,分为6~7个域,格式为X X X X X X X.其中X是一个域的占位符.最后一个代表年份的域非必须,可省略.单 ...
- Springboot整合Flowable6.x导出bpmn20
项目源码仓库 BPMN2.0(Business Process Model and Notation)是一套业务流程模型与符号建模标准,以XML为载体,以符号可视化业务,支持精准的执行语义来描述元素的 ...
- RESTful API 为何成为顶流 API 架构风格?
作者孙毅,API7.ai 技术工程师,Apache APISIX Committer 万物互联的世界充满着各式各样的 API ,如何统筹规范 API 至关重要.RESTful API 是目前世界上最流 ...
- 3520. 【NOIP2013模拟11.7B组】原根(math)
题目: 考试想法: 考试的时候觉得这些数学公式太恶心了,所以就直接跳过了. 正解: 直接暴力模拟就可以了. 代码: #include<bits/stdc++.h> using namesp ...
- Typora 最新中文版安装破解V1.4.8
Typora中文破解版是一款好用极简免费的跨平台Markdown编辑器,软件使用这款软件能够帮助用户轻松将文本转换到HTML,软件从底层向上设计,软件支持markdown的标准语法,同时这款软件还支持 ...
- MySQL-(InnoDB)事务和锁
在事务并行处理背景下,不同的事务之间因数据共享的状态变化,存在着某种依赖/隔离影响.即事务隔离级别. 事务隔离级别,官网的解释在这里. InnoDB提供 SQL:1992 标准描述的所有四种事务隔离级 ...