2

这是相当简单的方法。我entity framework用来获取一些数据,然后检查 a 中的一些值if statement。但是现在该方法标记为红色。

这是我的方法:

private bool IsSoleInProduction(long? shoeLastID)
{
    if (shoeLastID == null)
    {
        MessageBox.Show(Resources.ERROR_SAVE, 
                        "Error", 
                        MessageBoxButtons.OK, 
                        MessageBoxIcon.Error);
        return false;
    }

    ISoleService soleService = 
        UnityDependencyResolver.Instance.GetService<ISoleService>();

    List<Sole> entity = 
        soleService.All().Where(s => s.ShoeLastID == shoeLastID).ToList();

    if (entity.Count() != 0)
    {
        foreach (var items in entity)
        {
            if (items.Status == 20)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
    else
    {
        return false;
    }    
}

我错过了什么?

4

9 回答 9

7

您需要利用 LINQ with An y,替换您的代码:

if (entity.Count() != 0)
{
    foreach (var items in entity)
    {
        if (items.Status == 20)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
else
{
    return false;
}    

使用更简单的代码:

 return entity.Any(item => item.Status == 20);

甚至更好的性能:

 return soleService.All()
              .Any(s => s.ShoeLastID == shoeLastID
                     && s.Status == 20); 

编辑:随着您的评论,您需要以下代码:

  List<Sole> entity =  soleService.All()
                            .FirstOrDefault(s => s.ShoeLastID == shoeLastID);

  return entity == null ? false : entity.Status == 20;
于 2013-04-09T07:09:24.033 回答
3

如果您的集合中没有项目entity,则不会执行包含 if/else 的任何分支。在这种情况下,不再有 return 语句,因为该else部分不会被执行,并且在你之外你foreach没有 return 语句。

于 2013-04-09T07:01:54.317 回答
3

编译器不会“看到”如果

entity.Count() != 0

然后你的循环

foreach (var items in entity)

将至少运行一次。因此,它看到了运行forech零次而不运行else块的可能性。

假设第一次枚举entity,它产生一些(有限数量的)项目。那么将是非零的。然后假设下次枚举相同的内容时,它不会产生任何项目!这将导致您的代码“失败”而不返回。Countentity

您很可能可以保证每次重新枚举源时产生相同数量的项目。但是编译器不能。

解决方案:跳过if (entity.Count() != 0)foreach立即执行。

于 2013-04-09T07:15:44.557 回答
2

您没有从该代码块中重新运行任何内容

if (entity.Count() != 0)
            {
                foreach (var items in entity)
                {
                    if (items.Status == 20)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                // return someting
            }
于 2013-04-09T07:02:41.070 回答
1

你的entity.Count()is not0和你entity没有的是什么items

这意味着您的if块将起作用,但foreach部分不起作用。由于您的if部分没有任何 return 语句,这就是您收到错误的原因。

您应该将 return 声明放在您的if部分。

if (entity.Count() != 0)
{
    foreach (var items in entity)
    {
        if (items.Status == 20)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    //return true or false
}
于 2013-04-09T07:10:41.953 回答
1

您可以考虑执行以下操作。这将遵循“单一退出点”原则(有时有助于提高代码清晰度),并确保在任何情况下都有默认值:

private bool IsSoleInProduction(long? shoeLastID)
{
    // The main change: A default value, assuming "no":
    var isSoleInProduction = false; 

    if (shoeLastID == null)
    {
        MessageBox.Show(Resources.ERROR_SAVE, 
                        "Error", 
                        MessageBoxButtons.OK, 
                        MessageBoxIcon.Error);
        isSoleInProduction = false;
    }

    ISoleService soleService = 
        UnityDependencyResolver.Instance.GetService<ISoleService>();

    List<Sole> entity = 
        soleService.All().Where(s => s.ShoeLastID == shoeLastID).ToList();

    if (entity.Count() != 0)
    {
        foreach (var items in entity)
        {
            if (items.Status == 20)
            {
                isSoleInProduction = true;
            }
            else
            {
                isSoleInProduction = false;
            }
        }
    }
    else
    {
        isSoleInProduction = false;
    }    

    return isSoleInProduction;
}
于 2013-04-09T07:14:52.707 回答
0

如果您的实体集合没有元素,您将无法到达 return 语句 - 您需要添加 return false 例如作为最后一条语句

于 2013-04-09T07:04:27.017 回答
0

由于错误状态,可能存在未评估任何 return 子句的情况(例如,如果您的列表中没有元素)。为了快速解决它,您可以放置​​一个默认的 return 语句,例如将最后一个return子句移到语句之外else。但这实际上取决于您期望的行为。

 private bool IsSoleInProduction(long? shoeLastID)
        {
            if (shoeLastID == null)
            {
                MessageBox.Show(Resources.ERROR_SAVE, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            ISoleService soleService = UnityDependencyResolver.Instance.GetService<ISoleService>();
            List<Sole> entity = soleService.All().Where(s => s.ShoeLastID == shoeLastID).ToList();

            if (entity.Count() != 0)
            {
                foreach (var items in entity)
                {
                    if (items.Status == 20)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            return false;
        }
于 2013-04-09T07:05:51.610 回答
0

编译器不能保证第一次调用Count意味着foreach将至少循环一次(有充分的理由,因为如果您愿意,可以创建一个不正确的集合)。你可以这样做(不需要外部if):

foreach (var items in entity)
{
    if (items.Status == 20)
    {
        return true;
    }
    else
    {
        return false;
    }
}

return false;
于 2013-04-09T07:07:14.163 回答