簡體   English   中英

Lambda表達式和||實體框架中的運算符

[英]Lambda Expressions and the || operator in Entity Framework

我很驚訝這段代碼有效:

string category = null;
Category Category = null;
int categoryId = 0;

var products = repository.Products
    .Where(p => category == null || p.CategoryID == categoryId)
    .ToList();

但是下面的代碼失敗了

string category = null;
Category Category = null;
int categoryId = 0;

var products = repository.Products
    .Where(p => category == null || p.CategoryID == Category.CategoryID)
    .ToList();

我知道問題是即使我正在使用|| 操作員 - 它不像我想的那樣工作。

在第二個示例中,為什么要查看類別 - 即使類別值為空。 它不會被短路嗎?

您的“OR”將作為SQL發送到數據庫。 實體框架必須評估 Category才能構造發送到數據庫的正確SQL。 在您的第一個示例中,您沒有向Entity Framework提供相同的問題。 這不是短路問題,而是將表達式 (包括OR)轉換為正確的查詢。

要明確的是:如果你的查詢是在Linq-to-Objects的內存中發生的(作為一個例子),你期望它可以短路並避免解除引用null是正確的。 但事實並非如此。 整個表達式被轉換為SQL,這意味着它需要評估Category(已初始化為null)以獲取CategoryID,並且您的問題就出現了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM