如果值为null,则Linq删除where

时间:2016-02-04 07:42:55

标签: c# entity-framework linq

我的Linq查询

var result = db.APPLICATIONS
.Where(a => Statuses.Contains(a.STATUS_ID))
.Where(a => a.TrackingNo == TrackingNo)

Statuses是一个int列表,TrackingNo是一个可以为空的int(int?)。

问题: 如果TrackingNo为null,那么我不想运行此子句或只是跳过这个条件。

4 个答案:

答案 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;