4

我正在尝试实现一种方法:

  public Referee GetRefereeById(int refereeId)
        {
            var result = from b in Referees
                         where b.PersonId.Equals(refereeId)
                         select b;
            return (Referee)result;
        }

这个方法应该返回一个裁判对象。知道我做错了什么吗?

4

7 回答 7

10

尝试

return result.FirstOrDefault();
于 2013-11-12T14:10:33.910 回答
2

您的选择可以返回超过 1 名裁判。尝试

public Referee GetRefereeById(int refereeId)
    {
        var result = (from b in Referees
                     where b.PersonId.Equals(refereeId)
                     select b).FirstOrDefault();
        return (Referee)result;
    }

您可以使用 .Single(),但 FirstOrDefault 是更安全的选择。我假设 PersonId 应该是唯一的,所以这无关紧要,但如果没有找到匹配的数据,Single 会抛出异常。

于 2013-11-12T14:11:05.400 回答
2

你需要返回一个裁判,而不是很多。

使用FirstOrDefault- 返回序列的第一个元素,如果序列不包含任何元素,则返回默认值。(MSDN:http: //msdn.microsoft.com/en-us/library/bb340482%28v=vs.110%29.aspx

public Referee GetRefereeById(int refereeId)
{
   return Referees.FirstOrDefault(r => r.PersonId.Equals(refereeId));
}

null如果找不到,这将返回。

于 2013-11-12T14:13:45.847 回答
1

如果您希望找到结果,您应该这样做

Return result.Single();

如果不确定它是否存在,请检查是否为空:

Return result.SingleOrDefault();

我将实现 Single() 方法而不是 First()。您的方法将单个裁判返回给调用者。您想确保在每种情况下都得到一位独特的裁判。当有超过 1 个符合您的标准时,您将在您的应用程序中引入一些非常微妙的错误。假设您正在处理正确的记录,但您可能正在检索完全不同的记录。

如果您有一个在某种记录上排序的列表并且真的打算根据排序获得第一行,那么最好使用 First() 方法。

于 2013-11-12T14:10:35.247 回答
0

试试这个:

public Referee GetRefereeById(int refereeId)
        {
            var result = from b in Referees
                         where b.PersonId == refereeId
                         select b;
            return result.FirstOrDefault();
        }

也不需要进行强制转换来返回结果。

当您说它应该返回对象时,它会做什么?

于 2013-11-12T14:10:51.440 回答
0
var result = (from b in Referees
              where b.PersonId.Equals(refereeId)
              select b).SingleOrDefault();
return result;

这将返回一个Referee对象。

于 2013-11-12T14:11:18.797 回答
0

您的查询(更具体地说是Where函数)可以返回零个结果。根据您的需要使用、SingleSingleOrDefaultFirstFirstOrDefault

例如return (Referee)result.SingleOrDefault();

于 2013-11-12T14:11:49.120 回答