[英]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.