我的 Linq 查询
var result = db.APPLICATIONS
.Where(a => Statuses.Contains(a.STATUS_ID))
.Where(a => a.TrackingNo == TrackingNo)
Statuses
是一个 int 列表,TrackingNo
是一个可为 null 的 int (int?
)。
问题: 如果
TrackingNo
为空,那么我不想运行此子句或只是跳过此条件。
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 { a.STATUS_ID });
在
result2
之后添加 if
“构建”。
您可以使用其“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?”,那么这将起作用。
只需添加
&&
条件并检查null
。你可以在这里使用 1 where
条件,为什么第二个 where
。请尝试这个:
var result = db.APPLICATIONS
.Where(a => Statuses.Contains(a.STATUS_ID)
&& a.TrackingNo!=null
&& a.TrackingNo == TrackingNo)
在尝试向商店表达式添加更多内容之前,您应该首先检查过滤参数的值。如果可为空的 TrackingNo 有值,则仅应用 Statuses 和 TrackingNo 过滤。否则它将返回所有应用程序作为 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;
我认为如果值为空,你可以让它返回所有内容,例如:
.Where(q => id != null ? q.Id == id : true)