我正在尝试模拟:
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
答案 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字段匹配答案 1 :(得分:0)
使用“int?”时我通常使用object.Equals(i1,i2)比较它们,例如
from r in cxt.table
where object.Equals(r.column, nullableInt)
select r
这可以避免所有可以为空的问题。