C# 如何确保linq语句不会失败

C# 如何确保linq语句不会失败,c#,entity-framework,linq,C#,Entity Framework,Linq,什么是确保此linq语句按预期执行的正确方法,我的意思是所有参数都将填充为非空值 下面是一个例子: 公共异步任务GetArticlesByStatusarticleRequest请求 { var query=wait_context.article.AsNoTracking .x=>x.ArticleStatusId==intrequest.ArticleStatus.ToListSync; } 有一件事可能会出现问题,那就是request.ArticleStatus,如果该值为null,那么该

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

下面是一个例子:

公共异步任务GetArticlesByStatusarticleRequest请求 { var query=wait_context.article.AsNoTracking .x=>x.ArticleStatusId==intrequest.ArticleStatus.ToListSync; } 有一件事可能会出现问题,那就是request.ArticleStatus,如果该值为null,那么该语句将不正确

我试过这样的方法:

公共异步任务GetArticlesByStatusarticleRequest请求 { ifrequest.Status.HasValue//include.HasValue但我想还有更优雅的单线解决方案? { var query=wait_context.article.AsNoTracking .x=>x.ArticleStatusId==intrequest.ArticleStatus.ToListSync; } } 谢谢

Cheers

如果该方法接受ArticleStatus而不是articleRequest,它不会失败,也就是说,除非ArticleStatus为nullable ArticleStatus,否则在运行时您永远不会得到InvalidCastException?或具有除int以外的其他基础类型,int是枚举的默认基础类型:

public async Task<IEnumerable<articles>> GetArticlesByStatus(ArticleStatus status)
{
    var query = await _context.article.AsNoTracking()
        .Where(x => x.ArticleStatusId == (int)status).ToListAsync();
}
请注意,类似实体框架的ORMs可能无法将谓词转换为有效的SQL。

如果request.articlestStatus是可空的,则可以在查询中将其转换为可空的

公共异步任务GetArticlesByStatusarticleRequest请求 { var query=wait_context.article.AsNoTracking .x=>x.ArticleStatusId==int?request.ArticleStatus.ToListSync; 返回查询; } 这假设请求不是null,这是您需要检查的内容


也就是说,我个人更喜欢你发布的内容。我不知道你说的更优雅是什么意思,但是如果你从请求状态中提前知道查询不会有任何结果。。。为什么要运行它?为什么不直接跳过向数据库发送查询,只返回Enumerable.Empty?

request.ArticleStatus和request.Status之间的关系是什么?@Amy request.Status表示作为参数接收的ArticleStatus,它是作为Enum的ArticleStatus类型。这并不能真正回答我的问题。当您关心request.ArticleStatus时,为什么要检查request.Status是否有值?@Amy如果request.Status未填充,我的意思是如果它为null,则根本没有理由执行语句?我的意思是,我不能得到任何数据,除非它以某种方式或类似的方式被正确处理@如果传入null,您希望该方法返回什么?
Where(x => request == null || x.ArticleStatusId == (int)request.Status)