C# 用Lambda表达式叠加where条件
我们通常在C# 用Lambda表达式叠加where条件,c#,linq,lambda,C#,Linq,Lambda,我们通常在中添加多个条件,其中表达式以&&分隔(|) 假设,如果我将多个条件叠加在一起,性能有什么不同吗? 例如: 这是电话线吗 dbContext.Students.Where(s=> s.Section = 5 && s.Marks >50).ToList(); 近似 dbContext.Students.Where(s=>s.Section = 5).Where(s=>s.Marks > 50).ToList(); 注意:上面这一行可能是因
中添加多个条件,其中
表达式以&&
分隔(|
)
假设,如果我将多个条件叠加在一起,性能有什么不同吗?
例如:
这是电话线吗
dbContext.Students.Where(s=> s.Section = 5 && s.Marks >50).ToList();
近似
dbContext.Students.Where(s=>s.Section = 5).Where(s=>s.Marks > 50).ToList();
注意:上面这一行可能是因为
Where
返回inturn中具有Where的IQueryable语句到达db的时间是调用.ToList()
时。因此,您之前所做的不会在实践中产生太大的差异
然而,从纯数学性能的角度来看,与这些性能背后的翻译过程有关,应该存在一些差异。这可以通过@sujith karivelil建议的实验来理解,也可以通过深入阅读来理解。我认为使用“&&”和“| |”运算符而不是多个子句基本上会导致对整个集合进行一次枚举。多个“Where”子句意味着您将枚举整个集合,然后是结果,这可能再次是整个集合。我建议使用运算符“&&”。。因为它在一个时刻过滤记录,甚至使用多个条件。
但是如果您使用多个where语句,它肯定会影响性能,因为您使用where语句多少次会命中结果查询进行过滤 为什么不试着用秒表呢?可能重复尝试运行sql跟踪,您将看到linq提供程序生成的sql,如@Tolga Evcimen所述,IQueryable仅在调用ToList()时才进行计算called@sr28实际上,它不是一个完全相同的副本,因为您附加的链接谈到了内存中的可枚举项,从linqToSql的角度来看,PO实际上是古玩。据我所知:)@sujithkarivelil当然!!我明白了。你所说的是关于IEnumerable
,但这看起来像IQueryable
——而且大多数IQueryable
实现(除了AsQueryable()
)都是“可组合的”,这意味着在向外部服务发出低级查询之前,这些操作是由工具组合的(在本例中为数据库)