2013-11-12 2 views
1

Я пытаюсь реализовать метод:C# Linq возвращение объекта

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

Этот метод, как предполагается, возвращает объект судейскую. Любая идея, что я делаю неправильно?

ответ

8

Попробуйте

return result.FirstOrDefault(); 
+0

Это будет работать, но я нахожу реализацию первого (OrDefault) метода, который не очень подходит.Вы никогда не знаете, какую запись вы собираетесь вернуть, и, похоже, ожидаете уникального результата. На самом деле он должен разорваться, если будет больше одного. Я предпочитаю использовать FirstOrDefault только тогда, когда я действительно хочу первый, основанный на некоторых сортировках. – JMan

+0

@Jeroen. Вы можете подумать о добавлении этой информации в исходный вопрос - она ​​немного меняет требования. При этом вы, вероятно, захотите использовать «SingleOrDefault». Это вызовет исключение, если ваш запрос возвратит несколько элементов и вернет null, если не возвращаются никакие элементы. – matt

1

В случае, если вы ожидаете, чтобы найти результат, который вы должны сделать

Return result.Single(); 

Если не уверен, что существует сделать и проверить нуль:

Return result.SingleOrDefault(); 

Я бы реализуйте методы Single() вместо First(). Ваш метод возвращает одного рефери к вызывающему. Вы хотите удостовериться, что в каждом случае у вас есть единственный рефери. Когда более 1 соответствует вашим критериям, вы вводите некоторые очень тонкие ошибки в своем приложении. Предполагая, что вы работаете против правильной записи, но вместо этого вы можете получить совершенно другую.

Лучше использовать методы First(), если у вас есть список, который вы заказываете на какой-то записи, и действительно хотите получить первую строку на основе заказа.

0

попробовать это:

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

там также нет необходимости делать бросок для возврата результата.

, когда вы говорите, что предполагается вернуть объект, что он делает?

2

Ваш выбор может содержать более 1 рефери. Попробуйте

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

Вы можете использовать Одиночные(), но FirstOrDefault является более безопасным вариантом. Я предполагаю, что PersonId должен быть уникальным, поэтому это не имеет значения, но если совпадающие данные не найдены, Single будет генерировать исключение.

+0

Я бы по-прежнему предпочитаю Single. Возвращая First, вы не контролируете, какой объект вы будете возвращать. Если есть способ получить одного Рефери. Просто убедитесь, что он возвращает уникальный и правильный. – JMan

+0

Я согласен с тем, что в случае, если запрос возвращает более одного человека, приложение может быть разорвано. Но если данные не найдены, это может быть не лучшее поведение. Я думаю, все зависит от специфики приложения. У меня есть опыт получения данных с повреждением и havign для изменения Single to FirstOrDefault с регистрацией ошибок, чтобы не нарушать производственную среду, пока мы очистили данные :( Я стал немного аллерговым к Single, но я согласен, что это может быть overreaction :) – oerkelens

+0

в этом случае SingleOrDefault. Все зависит от того, что должен делать метод. Если вы действительно предполагаете, что должна быть запись с этим идентификатором, вы можете сделать Single(). Если это может быть Ничто не делает SingleOrDefault() – JMan

0
var result = (from b in Referees 
       where b.PersonId.Equals(refereeId) 
       select b).SingleOrDefault(); 
return result; 

Это возвращает объект Referee.

0

Ваш запрос (точнее, функция Where) может возвращать нулевые результаты. Используйте Single, SingleOrDefault, First или FirstOrDefault в зависимости от ваших потребностей.

например. return (Referee)result.SingleOrDefault();

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, если один не найден.

Смежные вопросы