1

次のコードについて奇妙な問題があります。

!isActive.HasValue || (isActive.HasValue && x.IsActive == isActive.Value)

isActivebool?型なので、isActiveisnullの場合、次のエラーが発生します。

Null 許容オブジェクトには値が必要です。

それについて何か考えはありますか?ご協力いただきありがとうございます!

更新 1:

public static List<User> Select(int userId, bool? isActive = null)
{
    var dl = DataLayer.GetDataContext();
    return dl.Users.Where(x => x.ID == userId
                && (!isActive.HasValue || (isActive.HasValue && x.IsActive == isActive.Value))).ToList();
}

これは、このエラーが発生したサンプル関数です。私はそれがとても奇妙であることを知っています!以下のように変更すると、動作します。

!isActive.HasValue || (isActive.HasValue && x.IsActive == isActive)

このエラーの意味は理解できますが、理由がわかりません。それはうまくいくはずです。だから私はそれを奇妙なことと呼んでいます!

更新 2:

  1. x.IsActive は bool? ではなく bool 型です。私はそれに確信しています:)
  2. DataLayer.GetDataContext() は、Linq to SQL 用です。

SQL Server を使用していることが原因である可能性はありますか?

これまでご協力いただきありがとうございました。

4

6 に答える 6

1

ああ、それは LINQ のクエリ ビルダーが原因です。isActive1 つのクエリで意図を実行する方法があるかもしれませんが (実際、q の更新されたコードはまさにそれを実行しているように思えます)、事前に の値を知っているため、2 つのクエリに分割するのが簡単です。そうすれば、クエリ ビルダーが何を行っているのか、何をしていないのかを気にする必要がなくなります。

さらに言えば、将来のメンテナーが誤って同じ罠に陥るのをより困難にするために、この 2 つの関数を完全に別々にすることもできます。

public static List<User> Select(int userId)
{
    return DataLayer.GetDataContext().Users.Where(x => x.ID == userId).ToList();
}

public static List<User> Select(int userId, bool isActive)
{
    return DataLayer.GetDataContext().Users.Where(x => x.ID == userId && x.IsActive == isActive).ToList();
}
于 2013-05-01T16:40:21.287 に答える
1

コードに2 つの異なる値があるため、2 番目のチェックをisActive見逃しているようです。x

!isActive.HasValue || (x.isActive.HasValue && (x.IsActive == isActive.Value))
                   ----^

また、順序や操作に関する混乱を避けるために、等価チェックの周りに括弧を追加しました

于 2013-05-01T15:41:39.320 に答える
-3

その型を bool から bool に変更しますか?

bool? IsActive = false;
于 2013-05-01T15:38:32.763 に答える