2012-06-08 27 views
2
var users=db.Users.Where(u => u.Name.StartsWith(term) || u.Email.StartsWith(term) || u.FirstName.StartsWith(term)).ToArray(); 
var jsos=users.Select(u => new { label = u.FirstName +" "+ u.Name+ " (" + u.Email+")", value = u.Id }); 

按預期工作。但是,如果沒有ToArray(),我會得到看似奇怪的行爲:nullfirstName導致標籤被評估爲null。與ToArray()我得到預期的行爲。 (null被視爲空字符串並連接到其他非空字符串)。爲什麼?爲什麼連接到非空字符串的空字符串評估爲null?

回答

7

在SQL世界中,根據定義,任何具有NULL作爲其一部分的表達式都將變爲NULL。這是因爲NULL意味着一個不確定的值 - 一個不確定的值+其他任何東西仍然是一個不確定的值,即NULL。

同樣,在SQL中,您可以使用像COALESCE這樣的方式將NULL轉換爲空字符串 - 我不記得linq等價物是什麼。

+2

* null-coalescing-operator *,'''''是C#/ Linq等價物。 –

+0

@KirkWoll:是的,謝謝! –

1

使用.ToArray(),您使用Linq對.NET類型,它在代碼中計算並使用.NET類型處理。在這裏,字符串連接方法以您習慣的方式工作。

沒有.ToArray,您的查詢在DBMS中執行,並使用系統配置爲使用NULL值的任何內容。

在這種情況下,DBMS被配置爲根據ANSI標準處理NULL,這與標準.NET中的地方差別很大。你應該查找ANSI NULL來找出細節。這並不複雜,但如果你不期待它會引起混淆。

兩個增 1)首先,我相信NULL值串聯規則ANSI標準都擺出來,但實際上我意識到我可能是錯的。我來自SQL Server後臺,其中ANSI_NULLS是一個控制NULL相等的設置,而串聯由另一個控制。如果我錯誤地將後者連接到前者,我表示歉意。 2)儘管我談到可配置性,並且SQL Server至少確實允許更改該配置,但您所看到的行爲絕對是標準,默認和期望的情況。如果你將會使用數據庫,你應該習慣它。