首页 > 其他分享 >关于linq Where中的”或者“运算只查询出来满足一种条件的数据的问题,本质是IEnumerable和IQuerable之间的区别

关于linq Where中的”或者“运算只查询出来满足一种条件的数据的问题,本质是IEnumerable和IQuerable之间的区别

时间:2023-06-20 13:45:50浏览次数:29  
标签:IQueryable 数据库 IEnumerable linq 查询 IQuerable query Where

如下代码所示,其中的"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之间的区别如下:

在使用IQueryableIEnumerableWhere方法进行“或者”运算时,存在一些区别。

  1. 延迟执行:IQueryable使用延迟执行,而IEnumerable则立即执行。延迟执行意味着IQueryable中的查询不会立即执行,直到实际需要结果时才会执行。这对于数据库查询非常有用,因为可以构建一个包含多个筛选条件的查询,然后将其发送到数据库执行。而IEnumerable会立即执行查询,因此它无法将查询传递给数据库进行优化处理。

  2. 数据库查询优化:IQueryable能够利用提供程序(例如Entity Framework)的功能,将Where条件转换为底层数据库的查询语句。这样可以在数据库层面进行优化,仅返回满足条件的结果。而IEnumerable只是在内存中对集合进行迭代,它不会将查询转换为数据库查询语句。

  3. 过滤的位置:使用IQueryable进行“或者”运算时,筛选条件会应用于数据库查询,因此数据库只返回满足条件的结果。而在IEnumerable中使用Where进行“或者”运算时,所有数据都将加载到内存中,然后再进行筛选。这可能会导致性能问题,尤其是当处理大量数据时。

综上所述,使用IQueryable进行“或者”运算更适合于数据库查询,它可以利用数据库的优化和延迟执行的特性。而IEnumerable适用于在内存中对集合进行简单的筛选操作,不涉及数据库查询优化。

标签:IQueryable,数据库,IEnumerable,linq,查询,IQuerable,query,Where
From: https://www.cnblogs.com/Poetwithapistol/p/17493131.html

相关文章

  • Linq关联两个DataTable合并为一个DataTable
    DataSetds;DataTabledt1=ds.Tables[0];DataTabledt2=ds.Tables[1];//关联varres=frommindt1.AsEnumerable()fromsindt2.AsEnumerable()wherem.Field&l......
  • LINQ to SQL
    @@sqllinqintogroup LINQtoSQL八大子句一、LINQ查询子句概述1.查询(Query)是一组指令,这些指令可以从一个或多个给定的数据源中检索数据,并指定检索结果的数据类型和表现形式。2.查询表达式是一种查询语法表示的表达式,由一组用类似于SQL的声明性语法编写的子句组成。3.每......
  • @@linq left join group
    @@linqleftjoingroup如何实现LINQ的leftjoingroupby语法? 在LINQ下这样写var query = (from st in db.Student                             join sc in db.Score on st.id equals sc.sid into g1        ......
  • C# LINQ
    视频链接:.NET6教程,.NetCore2022视频教程,杨中科主讲_哔哩哔哩_bilibiliLambda与LINQ为啥要学LINQ?让数据处理变得简单。【复习】委托1、委托是可以指向方法的类型,调用委托变量时执行的就是变量指向的方法。2、.NET中定义了泛型委托Action(无返回值)和Func(有返回值),所以......
  • Linq/Enumerable.cs
    usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Threading;//IncludeSilverlight'smanagedresources#ifSILVERLIGHTusingSystem.Core;#endif//SILVERLIGHTnamespaceSystem.Linq{publicstaticpartialc......
  • LINQ to SQL语句之对象标识和对象加载
    [list][*]对象标识[/list]运行库中的对象具有唯一标识。引用同一对象的两个变量实际上是引用此对象的同一实例。你更改一个变量后,可以通过另一个变量看到这些更改。关系数据库表中的行不具有唯一标识。由于每一行都具有唯一的主键,因此任何两行都不会共用......
  • Cannot cast Newtonsoft.Json.Linq.JObject to Newtonsoft.Json.Linq.JToken.
    @@CannotcastNewtonsoft.Json.Linq.JObjecttoNewtonsoft.Json.Linq.JToken 解决方法方法参数为[FromBody]objectcontent JObjectjo=(JObject)JsonConvert.DeserializeObject(content.ToString());JToken[]jtoArray=jo["contentBody"].ToArray();List<......
  • LINQ 操作
    定义:LINQ(读音link)代表语言集成查询(LanguageIntegratedQuery),是.NEt框架的扩展,它允许我们用SQL查询数据库的方式来查询数据的集合,使用它,你可以从数据库、程序对象的集合以及XML文档中查询数据//Seehttps://aka.ms/new-console-templateformoreinformation,usingSystem.N......
  • Linq 分组后取每一组时间最新的一条数据
    sqlSELECT*FROM(selectROW_NUMBER()over(partitionbyIdorderbyCollTimedesc)ASnewIndex,*fromTable)asTwhereT.newIndex=1结果: lambdavarquery=_repository.GetAll().GroupBy(r=>r.Id).Select(p=>p.OrderByDescending(r=>r.Coll......
  • Linq to SQL 多表Group By
    varpark=_context.ParkCountRecordsvararea=_context.AreaInfos;vardata=frompinparkjoinainareaonp.ProCodeequalsa.Codegroupp.ParkingNumb......