我知道& amp;短路评估,因此不必评估RHS如果不必这样做,但是EF呢?&amp之间有任何区别吗?&&&(对于|和||相同)?绩效!
但是EF呢?&amp之间有任何区别吗?&&&(对于|和||相同)?性能的!
是的,有。
首先,有时EF核心使用客户端评估,因此不能短路。
第二,即使使用服务器评估,EF Core也会以不同的方式翻译它们。例如,这是SQLServer的翻译:
LINQ SQL
============== ============
expr1 && expr2 expr1 AND expr2
expr1 & expr2 (expr1 & expr2) = 1
这是否会影响数据库查询优化器的性能取决于,但第一个通常看起来更好。一些没有本机支持bool
类型的数据库提供程序可能会产生效率低下的翻译,甚至无法翻译&
/|
谓词。
很快,最好始终在LINQ查询中使用逻辑&&
和||
操作员。
我决定进行实验:
var t1 = _db.Customers
.Where(x => x.FirstName == "james" | x.FirstName == "thomas")
.Select(x=>x.CustomerId).ToList();
vs。
var t2 = _db.Customers
.Where(x => x.FirstName == "james" || x.FirstName == "thomas")
.Select(x => x.CustomerId).ToList();
t1被执行为:
SELECT [x].[CustomerId]
FROM [Customers] AS [x]
WHERE (CASE
WHEN [x].[FirstName] = N'james'
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END | CASE
WHEN [x].[FirstName] = N'thomas'
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END) = 1
和t2 as:
SELECT [x].[CustomerId]
FROM [Customers] AS [x]
WHERE [x].[FirstName] IN (N'james', N'thomas')
都返回相同的结果。我比较了他们的执行计划,要执行T1,我进行了"索引扫描",而执行T2我有"索引搜索"。正如贾斯汀(Justin)提到的那样(SQL Server计划:索引扫描/索引搜索之间的差异)"寻求总是比扫描更好,因为它们在看起来数据的方式上更有效"。
所以,使用|or&&它不仅可能导致客户端评估,而且还会影响生成的SQL。
谢谢大家!
根据Microsoft文档:
1.&操作员以两种形式支持:一个单一的操作员或二进制逻辑运算符。
单方地址运算符:
Unary &
操作员返回其操作数的地址。有关更多信息,请参见:获取变量的地址。操作员地址&
需要不安全的上下文。
整数逻辑位和运算符:
对于整数类型,&
操作员计算其操作数的逻辑位AND
:
uint a = 0b_1111_1000;
uint b = 0b_1001_1111;
uint c = a & b;
Console.WriteLine(Convert.ToString(c, toBase: 2));
// Output:
// 10011000
2.&&操作员是有条件的逻辑和操作员,也称为"短路"逻辑和操作员,计算逻辑及其布尔操作数。如果x
和y
对true
进行评估,则x && y
的结果是正确的。否则,结果是false
。如果第一个操作数对false
评估,则未评估第二个操作数,并且操作的结果为false
。以下示例演示了该行为:
bool SecondOperand()
{
Console.WriteLine("Second operand is evaluated.");
return true;
}
bool a = false && SecondOperand(); // <-- second operand is not evaluated here
Console.WriteLine(a);
// Output:
// False
bool b = true && SecondOperand(); // <-- second operand is evaluated here
Console.WriteLine(b);
// Output:
// Second operand is evaluated.
// True
现在,如果EF/EF核心行为@IVAN Stoev在此大量解释:此处