我正在使用 .NetCore 1.1.2。当我为 GET
操作使用生成的操作时,如果在数据库中找不到任何内容,它应该返回 null,但 Null 验证不起作用。
我尝试使用 Single()
而不是 SingleOrDefault
并对抛出的异常使用 try catch,但这似乎不是一个优雅的解决方案。
也许是 .net 版本?
public IActionResult Success(string token)
{
var paymentMade = _context.Payments
.SingleOrDefaultAsync(m => m.StripeToken == token);
if (paymentMade == null)
{
return NotFound(); //this never gets fired when empty
}
return View();
}
最佳答案
您当前的方法存在两个问题。一个是您选择的方法,另一个是您尝试在同步上下文中使用它,即使它是异步的。
首先,SingleOrDefaultAsync
和其他异步方法一样,不返回任何有用的值,而是返回Task。 ,这是一个代表异步操作的对象。要获得上述操作的结果,您必须 await
它。
为此,您应该使您的方法异步或同步运行任务(不推荐,因为它会阻塞线程直到完成)。或者,您也可以简单地使用该方法的同步版本 SingleOrDefault
。
你的方法被修改为异步的看起来像这样:
public async Task<IActionResult> Success(string token)
{
var paymentMade = await _context.Payments.SingleOrDefaultAsync(m => m.StripeToken == token);
if (paymentMade == null)
{
return NotFound();
}
return View();
}
同步运行任务如下所示:
public IActionResult Success(string token)
{
var paymentMade = _context.Payments.SingleOrDefaultAsync(m => m.StripeToken == token).Result;
if (paymentMade == null)
{
return NotFound();
}
return View();
}
但是,您可能会遇到另一个问题。根据数据类型,SingleOrDefault
和其他类似方法(例如 FirstOrDefault
)可能从不返回 null。所有不可为 null 的内置类型(例如 bool 值、整数等)都是这种情况。如果您想要一种适用于所有情况的替代方法,try-catch 是您最好的选择:
try
{
var paymentMade = _context.Payments.First(m => m.StripeToken == token);
}
catch (InvalidOperationException)
{
return NotFound();
}
如果您不想这样做,请考虑像这样拆分:
var temp = _context.Payments.Where(m => m.StripeToken == token);
if (!temp.Count == 0)
{
return NotFound();
}
关于c# - Linq 查询在为空时不返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46390963/