IQueryable<string>
представляет запрос, который может вернуть любое количество строк .Вам нужна одна строка - поэтому вам нужно решить, что делать в различных ситуациях:
- Что вы хотите сделать, если у запроса нет результатов?
- Что вы хотите сделать, если запрос имеет один результат?(Я предполагаю, что это просто:)
- Что вы хотите сделать, если запрос имеет более одного результата?
Набор методов, которые позволяют вам определить все этоявляются:
Single
- сбой, если нет точно один результат SingleOrDefault
- сбой, если более одного результата, вернуть нольесли нет результатов First
- завершиться неудачей, если результатов нет, вернуть первое из многих FirstOrDefault
- вернуть ноль, если результатов нет, или первое из многих Last
- ошибка, если результатов нет, возвращает последнее из многих LastOrDefault
- возвращает ноль, если результатов нет, или последнее из многих
В каждом случае «fail» означает «выбросить исключение».(IIRC всегда InvalidOperationException
, по крайней мере, в LINQ to Objects, но я могу ошибаться.)
Так что, если вы запрашиваете идентификатор, который должен существовать (т.е. этоошибка, если это не так) тогда Single
, вероятно, уместно.Если вы запрашиваете идентификатор, который может не существовать , используйте SingleOrDefault
и проверьте, является ли возвращаемое значение нулевым.Если вы не запрашиваете идентификатор, вы , вероятно, хотите использовать FirstOrDefault
или просто перебирать результаты.
(Обратите внимание, что значением по умолчанию являетсяnull
связано с тем, что это запрос, возвращающий строки, а строка является ссылочным типом. Как правило, это значение по умолчанию для типа элемента - поэтому, если у вас есть IQueryable<int>
, возвращаемое значение по умолчанию будет 0.)