Linq 删除值为 null 的位置

问题描述 投票:0回答:5

我的 Linq 查询

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

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

问题: 如果

TrackingNo
为空,那么我不想运行此子句或只是跳过此条件。

c# entity-framework linq
5个回答
5
投票

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
“构建”。


3
投票

您可以使用其“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
投票

只需添加

&&
条件并检查
null
。你可以在这里使用 1
where
条件,为什么第二个
where
。请尝试这个:

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

2
投票

在尝试向商店表达式添加更多内容之前,您应该首先检查过滤参数的值。如果可为空的 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;

0
投票

我认为如果值为空,你可以让它返回所有内容,例如:

.Where(q => id != null ? q.Id == id : true)
© www.soinside.com 2019 - 2024. All rights reserved.