Linq remove where如果值为null

7kjnsjlb  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(155)

我的Linq查询

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

字符串
Statuses是一个int列表,TrackingNo是一个可空的int(int?)。

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

iyr7buue

iyr7buue1#

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

vc9ivgsu

vc9ivgsu2#

你可以使用它的“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?"类型,那么这将起作用。

hwamh0ep

hwamh0ep3#

只需添加&&条件并检查null。您可以在这里使用1 where条件,为什么第二个where。请尝试以下操作:

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

字符串

cgvd09ve

cgvd09ve4#

在尝试向store表达式添加更多内容之前,您应该首先检查筛选参数的值。如果可空的TrackingNo具有值,则仅应用Statuses和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;

svgewumm

svgewumm5#

我认为你可以让它返回所有值,如果值为null,就像这样:

.Where(q => id != null ? q.Id == id : true)

字符串

相关问题