确保此 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>()
呢?