【问题标题】:how to return false if no records exist in table如果表中不存在记录如何返回false
【发布时间】:2014-03-09 10:22:41
【问题描述】:

想检查ClientAccessCode表中是否存在任何记录,如果不存在则返回false...

if (!CheckAccessCodeExists())
{
    Console.WriteLine("Client Access code does not exist");
    throw new ConfigurationErrorsException("Client Access code does not exist");
}

private static bool CheckAccessCodeExists()
{
    using (EPOSEntities db = new EPOSEntities())
    {
        ClientAccountAccess clientAccess = db.ClientAccountAccesses
                .OrderByDescending(x => x.Id)
                .Take(1)
                .Single();

        if (clientAccess != null)
        {
            return true;
        }
        return false;
    }
}

//这是标记序列在lamba表达式中不包含任何元素,那我怎么才能返回false呢?也许使用 .Any() ?

谢谢

编辑 非常感谢大家的帮助,我现在标记答案,如果我有另一个问题

ClientAccountAccess clientAccess = db.ClientAccountAccesses
                  .OrderByDescending(x => x.Id)
                  .Take(1)
                  .Single();

if (clientAccess != null)
{
    db.DeleteObject(clientAccess);
}

我怎样才能把它重构成更整洁的东西

if (db.ClientAccountAccesses.Any())
{
    db.DeleteObject(//what does in here do I have to use above code to get record to delete?);
}

【问题讨论】:

  • 只删除所有内容?
  • 考虑到表中只有一条记录,是的,删除记录,但不是实际的表
  • @John 查看更新的答案

标签: c# asp.net linq asp.net-mvc-3


【解决方案1】:

问题是Single 期望集合中有至少一项,如果找不到 1 则抛出异常。如果您的收藏可能没有记录,那么您应该使用 SingleOrDefault - 这将返回您正在使用的类型的默认值,在您的情况下,这将返回 null

ClientAccountAccess clientAccess = db.ClientAccountAccesses
    .OrderByDescending(x => x.Id)
    .Take(1)
    .SingleOrDefault();

if (clientAccess != null)
{
    db.DeleteObject(clientAccess);
}

【讨论】:

  • 是的,您正在阅读问题的文字内容并深入到问题的核心。我要补充一点,您当然可以将 Single 包装在 try-catch 中(我不推荐这种方法,但很高兴知道您的选择)。
  • 似乎您进行了 4 次查询以执行删除单个记录,也没有 db.SaveChanges() 方法。
  • @NikolaMitev 请指出 4 个查询,因为我只看到 1 个(调用 SaveChanges 时为 2 个)?是的,我故意忽略了它,因为那不是我想要展示的内容
【解决方案2】:
private static bool CheckAccessCodeExists()
    {
        using (EPOSEntities db = new EPOSEntities())
        {
            var item = db.ClientAccountAccesses.FirstOrDefault();
            if(item != null)
            {
               db.Remove(item);
               db.SaveChanges(); 
               return true;                 
            }

            return false;
        }
    }

【讨论】:

  • 为您的编辑更新了解决方案。否决选民请发表评论。
  • 啊对了,玩的时候更新了忘记换回来了。固定的。干杯。
【解决方案3】:
    private static bool CheckAccessCodeExists()
    {
        using (EPOSEntities db = new EPOSEntities())
        {
            var item = db.ClientAccountAccesses.FirstOrDefault();
            if (item != null)
            {
                db.DeleteObject(item);
                db.SaveChanges();
                return true;
            }             
        }
        return false;
    }

【讨论】:

  • 当您可以摆脱 2 次时执行 3 次查询似乎很浪费,这还会检查是否存在 any 记录,OP 正在检查是否存在 特定的记录已经存在。
猜你喜欢
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 2011-02-21
  • 2021-09-19
  • 2021-09-11
  • 1970-01-01
  • 2021-02-26
  • 2018-03-24
相关资源
最近更新 更多