Linq-Sql IQueryable <t>和链接OR操作</t>

时间:2009-11-30 13:01:44

标签: linq-to-sql iqueryable conditional-operator

我正在尝试模拟:

WHERE x.IsActive = true OR x.Id = 5

以下原因使用'AND'...如何使用IQueryable(qry)和我的nullable 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对象必须有一个值”在尝试组合所有在一个答案时。是什么原因导致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)));
            }

在某些情况下,使用可空的.Value属性似乎也有所不同,如我在此处的另一个问题所示Linq to SQL Int16 Gets Converted as Int32 In SQL Command

2 个答案:

答案 0 :(得分:2)

试试这个:

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

请注意,我们将int?int进行比较,而不是将int进行比较。

我在这里假设查询的要点是过滤掉是否符合某些条件。

  • 如果onlyActiveItems为真,则验证IsActive字段是否为真
  • 如果whenSpecifiedMustIncludeRecordWithThisId.HasValue为真,则验证该值是否与Id字段匹配
  • 如果两者都为真,则逻辑上或条件
  • 如果两者都为false,则显示所有记录(如果这不是意图,则可以删除最后一个条件)

答案 1 :(得分:0)

使用“int?”时我通常使用object.Equals(i1,i2)比较它们,例如

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

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