c# - Linq 查询在为空时不返回 null

标签 c# .net linq asp.net-core

我正在使用 .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/

相关文章:

c# - 使用任意数量的属性初始化新的匿名对象的表达式树

c# - C#析构函数在哪里

c# - 从 C# 传递位值

c# - 在哪里可以找到用于升级到 System.Web.Http v5.0.0.0 的 NuGet 包?

.net - 尝试激活 'DatabaseConfiguration' 时无法解析类型 'MyDbContext' 的服务

c# - 使用 Dapper 映射嵌套对象列表

c# - 检查两个逗号分隔的字符串是否相等(对于内容集)

c# - LINQ to Entities 无法识别方法 'Int32

c# - 使用星号的图表(循环、数组)

c# - Windows 安装程序 (C#) 错误代码 2869