1

私はシミュレートしようとしています:

WHERE x.IsActive = true または x.Id = 5

以下では、'AND' が使用されます... IQueryable (qry) と null 許容 int を使用して 'OR' 条件をシミュレートするにはどうすればよいですか?

            if (onlyActiveItems) //bool
            {
                qry = qry.Where(x => x.IsActive == true);
            }

            if (whenSpecifiedMustIncludeRecordWithThisId.HasValue) //int?
            {
                qry = qry.Where(x => x.Id == whenSpecifiedMustIncludeRecordWithThisId.Value);
            }

私はユニオンを検討しましたが、これに対する答えはもっと簡単なはずです。


これは、すべてを1つの回答にまとめようとするときに「Nullableオブジェクトには値が必要です」という問題を回避する1つの解決策です。それ以外の場合、null の場合に nullable が評価される原因は何ですか?

            if (whenSpecifiedMustIncludeRecordWithThisId.HasValue)
            {
                qry = qry.Where(x => (!onlyActiveItems || (onlyActiveItems && x.IsActive)) || x.Id == whenSpecifiedMustIncludeRecordWithThisId.Value);
            }
            else
            {
                qry = qry.Where(x => (!onlyActiveItems || (onlyActiveItems && x.IsActive)));
            }

また、場合によっては、nullable の .Value プロパティを使用すると、私の別の質問で見られるように違いが生じるようです。Linq to SQL Int16 Gets Converted as Int32 In SQL Command

4

2 に答える 2

2

これを試して:

qry = qry.Where(x => (onlyActiveItems
                      ? x.IsActive
                      : false) ||
                     (whenSpecifiedMustIncludeRecordWithThisId.HasValue
                      ? x.Id == whenSpecifiedMustIncludeRecordWithThisId
                      : false) ||
                     (!onlyActiveItems && !whenSpecifiedMustIncludeRecordWithThisId.HasValue));

2つではなく、とを比較していることに注意してint?ください。intint

ここでは、クエリのポイントは、特定の条件が満たされた場合にフィルターで除外することであると想定しています。

  • trueの場合onlyActiveItems、IsActiveフィールドがtrueかどうかを確認します
  • trueの場合whenSpecifiedMustIncludeRecordWithThisId.HasValue、値がIdフィールドと一致するかどうかを確認します
  • 両方が真の場合、論理的にまたは条件をORします
  • 両方がfalseの場合、すべてのレコードが表示されます(これが意図されていない場合は、最後の条件を削除できます)
于 2009-11-30T13:11:39.280 に答える
0

「int?」で作業する場合 私は通常、object.Equals(i1, i2) を使用してそれらを比較します。たとえば、

from r in cxt.table
where object.Equals(r.column, nullableInt)
select r

これにより、すべての nullable 問題が回避されます。

于 2010-06-25T08:22:35.670 に答える