【问题标题】:FirstOrDefault giving wrong incorrect resultFirstOrDefault 给出错误的错误结果
【发布时间】:2014-09-16 08:09:05
【问题描述】:

我对如何解决这个问题感到困惑。

如果 custID = 0

,我想显示“未找到客户”
@if (Model.Customer == null)
{
    <p>no customer found</p>
}
else
{
<p> @Model.Customer.CustomerName </p>        
}

控制器:

  public ActionResult Index(int custID = 0)  
        {
         var customer = (from c in db.Customers
         where c.Id == (custID == 0 ? c.Id : custID)
         select c).FirstOrDefault();    // .SingleOrDefault(); 

        routes.MapRoute(
                  null,
                  "AAA/Index/{custID}",
                  new { controller = "AAA", action = "Index" }, new { custID = @"\d+" });

转到 URL“/AAA/Index/0”会在表中给出记录编号 ID = 1,如果没有 ID 为 0 的记录,则不为空。

我使用 SingleOrDefault 并出现以下错误:

序列包含多个元素

当“custID = 0”的记录不应该被找到时,FirstOrDefault() 怎么没有给我默认的 null 值?

【问题讨论】:

  • 我对MVC有点陌生,但是你不会只是为Index()创建一个不接受任何参数的重载,而不是使用0作为伪客户ID吗?跨度>
  • @mason 实际上最好使用int? custId
  • 为什么在where 中需要(custID == 0 ? c.Id : custID)?如果您将 custID 作为 0 传递,这将始终是正确的。
  • @rageit 我同意,刚刚得出了相同的结论:如果custID 为零,则所有客户都会被退回。
  • @Richard 我写评论都慢了:)

标签: asp.net asp.net-mvc linq asp.net-mvc-4


【解决方案1】:

custID == 0 时,您的情况如下所示:

where c.Id == c.Id

这显然适用于任何记录。 SingleOrDefault 失败,因为有多个,FirstOrDefault 返回第一个。

也许你只想要:

where c.Id == custID

或者如果您的数据库包含一条 Id 等于 0 的记录,但您不想返回它:

where custID != 0 && c.Id == custID

【讨论】:

  • 并且由于没有定义顺序,它会按照数据库决定返回它的任何顺序返回。
  • 所以问题出在“where c.Id == (custID == 0 ? c.Id : custID)”子句上?我在另一种情况下使用了它,当我希望参数的值为零时它可以工作。但我没有使用 FirstOrDefault()。关于如何解决这个问题的任何想法?谢谢
  • @MikeHowe 很难猜出你的意图是什么。我用两个建议编辑了答案。
  • @MikeHowe Good questions 让用户知道您想要什么结果。例如,您可能会说,如果传递了一个值,我想搜索那个值,如果没有传递一个值,我想返回 null
  • 我实际上假设你只是做if (custId == 0) return null;
猜你喜欢
  • 2011-11-15
  • 2019-02-06
  • 2014-01-30
  • 2018-08-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多