0

我有一个查询

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

此查询返回一个 IEnumerable。我期待一个'int'

帮我修改我的 LINQ 查询

4

5 回答 5

2

如果您希望查询仅返回单个值,请使用Single扩展方法。

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

请注意,如果没有值, Single会抛出异常。如果这不是您想要的,请使用SingleOrDefault

于 2011-01-22T12:52:15.833 回答
1

您始终可以将其添加到查询的末尾:

.Single();

如果您的可枚举只包含一个值,它将返回一个值,或者如果它包含的数量不是一个,则抛出异常。

于 2011-01-22T12:52:24.700 回答
0

根据您的数据添加.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如果您不希望在没有返回数据的情况下出现异常)。多行将在Singleor上引发异常SingleOrDefault

于 2011-01-22T12:52:58.570 回答
0

在查询中添加First()子句:

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

您可能希望FirstOfDefault()在没有结果的情况下使用,因为First()在这种情况下会引发异常。

于 2011-01-22T12:53:00.643 回答
0

只是SingleOrDefault()代替Select(),请记住,如果有多个结果你会得到一个异常,你也可以使用FirstOrDefault(),所以它看起来像:

row.GetChildRows("EventCategoryRelation")
.Where(categoryRow => categoryRow["event_id"].ToString() == eventObject.EventId.ToString())
.SingleOrDefault(x => Int32.Parse(x["category_id"].ToString()))
于 2011-01-22T12:57:33.200 回答