5

という列を持つUserテーブルがあり、変更できません。一部のレコードには、実際にはその列にが含まれています。BIT NULLNxEnabledNULL

C#でNullableを使用したくないので、プロジェクションでtrueと比較するのは理にかなっています(コードは単純化されていますが、これは同じエラーを生成します):

context.Users.Where(x => x.Id == 4)
             .Select(x => new 
                  { 
                      Id = x.Id,
                      Name = x.Name,
                      Enabled = x.NxEnabled == true
                  });

このクエリが

InvalidOperationException:null値は、null許容値ではないタイプのSystem.Booleanタイプのメンバーに割り当てることはできません。`

列挙されたとき?

編集:タイプミスでごめんなさい。クエリは実際にはもっと複雑でしたが、where句は問題ではありません。

4

3 に答える 3

4

フィールドと比較するtrue.IsEnabled、LINQtoSQLtrueはクエリのパラメータとしてを渡します。それに関する問題は、翻訳が返されることNULLです:

SELECT [t0].[Id], [t0].[Name],
    (CASE 
        WHEN [t0].[NxEnabled] = @p0 THEN 1
        WHEN NOT ([t0].[NxEnabled] = @p0) THEN 0
        ELSE NULL
     END) AS [Enabled]
FROM [Users] AS [t0]

SQL92がNULLとの比較がどのように機能するかを定義する方法のため、両方のWHEN条件はfalseです。このブログ投稿で説明されています[免責事項:投稿は私のものです]

Enabled = NxEnabled ?? false代わりに回避策として使用してください。

于 2013-01-14T22:02:51.323 に答える
3

タイプミス-あなたはdouble-equalsが必要です==

.Where(x => x.Id == 4)
于 2013-01-14T21:59:59.613 に答える
0
context.Users.Where(x => x.Id == 4)
             .Select(x => new Users()
                  { 
                      Id = x.Id,
                      Name = x.Name,
                      NxEnabled = x.NxEnabled ?? false
                  });
于 2013-01-14T22:00:47.653 に答える