如何确保 linq 语句不会失败



确保此 linq 语句按预期执行的正确方法是什么,我的意思是将填充所有参数(不是空值(。

下面是示例:

public async Task<IEnumerable<articles>> GetArticlesByStatus(articleRequest request)
{
var query = await _context.article.AsNoTracking()
.Where(x => x.ArticleStatusId == (int)request.ArticleStatus).ToListAsync();
}

有一件事可能是问题,那就是request.ArticleStatus,如果这是空的,那么这个陈述将不正确。

我尝试过这样的东西:

public async Task<IEnumerable<articles>> GetArticlesByStatus(articleRequest request)
{
if(request.Status.HasValue) // Included .HasValue but I guess there's more elegant one line solution?
{
var query = await _context.article.AsNoTracking()
.Where(x => x.ArticleStatusId == (int)request.ArticleStatus).ToListAsync();
}
}

谢谢

干杯

如果该方法接受ArticleStatus而不是articleRequest,它不会失败,即你永远不会在运行时得到InvalidCastException,除非ArticleStatus可为空(ArticleStatus?(或具有除int以外的其他底层类型(这是枚举的默认底层类型(:

public async Task<IEnumerable<articles>> GetArticlesByStatus(ArticleStatus status)
{
var query = await _context.article.AsNoTracking()
.Where(x => x.ArticleStatusId == (int)status).ToListAsync();
}

我假设ArticleStatus是一个enum.

如果保留articleRequest参数并且articleRequest是可为 null 的引用类型,则应在尝试访问其Status属性之前检查它是否null

Where(x => request == null || x.ArticleStatusId == (int)request.Status)

请注意,像实体框架这样的 ORM 可能无法将您的谓词转换为有效的 SQL。

如果request.ArticleStatus是一个Nullable<ArticleStatus>那么你可以把它投射到查询中的Nullable<int>

public async Task<IEnumerable<articles>> GetArticlesByStatus(articleRequest request)
{
var query = await _context.article.AsNoTracking()
.Where(x => x.ArticleStatusId == (int?)request.ArticleStatus).ToListAsync();
return query;
}

这假设request不为 null,这是您需要检查的内容。

也就是说,我个人更喜欢你发布的内容。我不确定您所说的"更优雅"是什么意思,但是如果您事先从request状态知道查询不会有任何结果......为什么要运行它?为什么不直接跳过向数据库发送查询而只返回Enumerable.Empty<articles>()呢?

最新更新