我的Linq查询
var result = db.APPLICATIONS
.Where(a => Statuses.Contains(a.STATUS_ID))
.Where(a => a.TrackingNo == TrackingNo)
Statuses
是一个int列表,TrackingNo
是一个可以为空的int(int?
)。
问题:
如果TrackingNo
为null,那么我不想运行此子句或只是跳过这个条件。
答案 0 :(得分:4)
可以通过多个步骤构建LINQ查询:
var result = db.APPLICATIONS
.Where(a => Statuses.Contains(a.STATUS_ID));
if (TrackingNo != null)
{
result = result.Where(a => a.TrackingNo == TrackingNo);
}
请注意,如果您有Select
(投影),则可能必须在多个变量中以多个步骤构建查询:
var result2 = result.Select(a => new { STATUS_ID });
result2
之后的if
“已建成”。
答案 1 :(得分:2)
您可以使用" HasValue"来检查可为空的int。属性。
var result = db.APPLICATIONS
.Where(a => Statuses.Contains(a.STATUS_ID))
.Where(a => a.HasValue && (a.TrackingNo == TrackingNo))
这将使它评估" HasValue"在检查值本身之前。如果HasValue返回false,那么它将永远不会计算表达式的其余部分(因此不会导致NullReferenceException)。 如果它是" int?"的类型,那么这将起作用。
答案 2 :(得分:1)
只需添加&&
条件并检查null
即可。你可以在这里使用1 where
条件为什么第二个where
。请试试这个:
var result = db.APPLICATIONS
.Where(a => Statuses.Contains(a.STATUS_ID)
&& a.TrackingNo!=null
&& a.TrackingNo == TrackingNo)
答案 3 :(得分:1)
在尝试向商店表达式添加更多内容之前,应首先检查过滤参数的值。如果可空的TrackingNo具有值,则仅应用状态和TrackingNo过滤。否则,它将返回所有APPLICATIONS作为IQueryable。
var result = db.APPLICATIONS.AsQueryable();
if (TrackingNo.HasValue)
{
result = result.Where(a => Statuses.Contains(a.STATUS_ID) && a.TrackingNo == TrackingNo);
}
return result;
或者,这将检查您是否有任何要应用的状态和分开跟踪。
var result = db.APPLICATIONS.AsQueryable();
if (Statuses != null && Statuses.Count() > 0)
{
result = result.Where(a => Statuses.Contains(a.STATUS_ID));
}
if (TrackingNo.HasValue)
{
result = result.Where(a => a.TrackingNo == TrackingNo);
}
return result;
或第三种选择,因为目前还不清楚你真正想要的是什么。这将始终应用状态过滤,仅在可用时跟踪
var result = db.APPLICATIONS.Where(a => Statuses.Contains(a.STATUS_ID));
if (TrackingNo.HasValue)
{
result = result.Where(a => a.TrackingNo == TrackingNo);
}
return result;