возврат одного результата с использованием LINQ - PullRequest
0 голосов
/ 22 января 2011

У меня есть запрос

row.GetChildRows("EventCategoryRelation")
  .Where(categoryRow => categoryRow["event_id"].ToString() == eventObject.EventId.ToString())
  .Select(x => Int32.Parse(x["category_id"].ToString()))

Этот запрос возвращает IEnumerable. Я ожидаю 'int'

Помогите мне изменить мой запрос LINQ

Ответы [ 5 ]

2 голосов
/ 22 января 2011

Если вы ожидаете, что ваш запрос вернет только одно значение, используйте метод расширения Single .

row.GetChildRows("EventCategoryRelation")
   .Where(categoryRow => categoryRow["event_id"].ToString() == eventObject.EventId.ToString())
   .Select(x => Int32.Parse(x["category_id"].ToString()))
   .Single();

Обратите внимание, что Single сгенерирует исключение, если значение не указано. Если это не то, что вы хотите, используйте SingleOrDefault .

1 голос
/ 22 января 2011

Вы всегда можете добавить это в конец вашего запроса:

.Single();

Это вернет одно значение, если ваше перечислимое содержит только одно, или сгенерирует исключение, если оно содержит другое количество, чем единица.

0 голосов
/ 22 января 2011

просто SingleOrDefault() вместо Select(), имейте в виду, что если имеется более одного результата, вы получите исключение, вы также можете использовать FirstOrDefault(), поэтому оно будет выглядеть следующим образом:

row.GetChildRows("EventCategoryRelation")
.Where(categoryRow => categoryRow["event_id"].ToString() == eventObject.EventId.ToString())
.SingleOrDefault(x => Int32.Parse(x["category_id"].ToString()))
0 голосов
/ 22 января 2011

Добавить предложение First() к запросу:

row.GetChildRows("EventCategoryRelation")
  .Where(categoryRow => categoryRow["event_id"].ToString() == eventObject.EventId.ToString())
  .Select(x => Int32.Parse(x["category_id"].ToString()))
  .First()

Вы можете использовать FirstOfDefault() в случае отсутствия результатов, так как First() выдаст исключение в таком случае.

0 голосов
/ 22 января 2011

В зависимости от ваших данных добавьте .FirstOrDefault, .SingleOrDefault(), .First() и т. Д.

ow.GetChildRows("EventCategoryRelation")
  .Where(categoryRow => categoryRow["event_id"].ToString() == eventObject.EventId.ToString())
  .Select(x => Int32.Parse(x["category_id"].ToString())).FirstOrDefault()

Если вы ожидаете несколько строк, используйте First (FirstOrDefault, если вы не хотите исключения, если данные не возвращаются). Несколько строк приведут к исключению на Single или SingleOrDefault.

...