簡體   English   中英

Linq查詢轉換為SQL會導致空參數值混亂

[英]Linq query translation to SQL messes up null parameter values

這是一個簡單的LINQ查詢:

var objs = db.Objects.Where(o => o.Field1 == val);

這轉換為SQL查詢:

select * from [Object] where Field1 = @p1

麻煩的是, val的值也可以合法地為null。 並且SQL不喜歡比較空值; 它堅持語法... where Field1 is null

有沒有辦法做到這一點整齊,沒有使用?? / isnull操作?

這再一次是LINQ支持中的EF弱點。 好的舊LINQ to SQL根據val的運行時值正確地翻譯了這個。

我建議你這樣做:

var objs = db.Objects.Where(
   o => (o.Field1 == val) || (o.Field1 == null && val == null));

如果EF對此進行了翻譯,那么SQL Server查詢優化器將實際獲取此模式並將其優化為“等於空”檢查。 您甚至可以使用此代碼模式來查找索引,它只是起作用。 在查詢計划中,與EQ相比,它顯示為IS

怎么樣.HasValue

var objs = db.Objects.Where(o => !o.Field1.HasValue && o.Field1 == val);

暫無
暫無

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

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