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()、奇妙な動作のように見えます:null firstNameラベルは として評価されnullます。ToArray()期待される動作が得られます。(null は空の文字列として扱われ、他の空でない文字列に連結されます)。なんで?

4

2 に答える 2

7

SQL の世界では、定義上、NULL を含む式はすべて NULL になります。これは、NULL が不定値を意味するためです。つまり、不定値 + それ以外は不定値、つまり NULL です。

繰り返しになりますが、SQL では、COALESCE のようなものを使用して NULL をたとえば空白の文字列に変換できます。linq に相当するものが何であるかは覚えていません。

于 2012-06-08T00:20:35.520 に答える
1

.ToArray() を使用すると、コードで評価され、.NET 型の処理を使用する .NET 型に対して Linq を使用しています。ここで、文字列連結メソッドは、慣れ親しんだ方法で機能します。

.ToArray を使用しない場合、クエリは DBMS で実行され、そのシステムが NULL 値に使用するように構成されているものを使用します。

この場合、DBMS は ANSI 標準に従って NULL を処理するように構成されており、.NET とは場所によって大きく異なります。詳細を確認するには、ANSI NULL を検索する必要があります。複雑ではありませんが、予期しない場合は混乱する可能性があります。

2 つの補遺 1) まず、NULL の連結規則は ANSI 標準に定められていると思いますが、実際には間違っている可能性があることを認識しています。私は、ANSI_NULLS が NULL の等価性を制御する設定であるのに対し、連結は別のものによって制御される SQL Server のバックグラウンドから来ました。後者を前者に誤ってリンクしている場合は、お詫び申し上げます。

2) 構成可能性について話し、SQL Server では少なくともその構成を変更できるという事実にもかかわらず、表示されている動作が標準であり、既定であり、期待どおりであることは間違いありません。データベースを頻繁に使用する場合は、それに慣れる必要があります。

于 2012-06-08T00:24:56.210 に答える