1

我正在尝试模拟:

其中 x.IsActive = true 或 x.Id = 5

以下导致使用“AND”...如何使用 IQueryable (qry) 和我的可为空的 int 模拟“OR”条件,因为此处可能涉及其他过滤,就像 IsActive 过滤器一样?

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

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

我考虑过联合,但它的答案似乎应该简单得多。


这是一种解决方案,它解决了我在尝试组合所有答案时遇到的“可空对象必须具有值”的问题。是什么导致 nullable 在其他情况下为 null 时被评估?

            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));

请注意,我们将 anint?与 an进行比较int,而不是两个ints。

我在这里假设查询的目的是过滤掉是否满足某些条件。

  • 如果onlyActiveItems为真,则验证 IsActive 字段是否为真
  • 如果whenSpecifiedMustIncludeRecordWithThisId.HasValue为真,则验证该值是否与 Id 字段匹配
  • 如果两者都为真,它将在逻辑上或条件
  • 如果两者都是假的,则显示所有记录(如果这不是意图,您可以删除最后一个条件)
于 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

这避免了所有可以为空的问题。

于 2010-06-25T08:22:35.670 回答