使用LINQ返回单个结果

时间:2011-01-22 12:47:29

标签: c# .net linq datarow

我有一个查询

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

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

帮我修改我的LINQ查询

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

.Single();

如果您的枚举只包含一个值,那么它将返回一个值,如果它包含的数量超过一个则抛出异常。

答案 2 :(得分: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)。多行会在SingleSingleOrDefault上抛出异常。

答案 3 :(得分: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()会在这种情况下抛出异常。

答案 4 :(得分:0)

SingleOrDefault()代替Select(),请记住,如果有多个结果您将获得异常,您还可以使用FirstOrDefault(),因此它看起来像:

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