如何返回IEnumerable?

时间:2011-04-02 20:58:06

标签: c# linq-to-entities

我正在尝试返回IEnumerable。这是我的代码:

public static IEnumerable<int> GetAnswersIDs(int id)
{
    using (var context = new MvcApplication4.Entity.test2Entities1())
    {
        return (from p in context.post
                  where p.post_parentid == id && p.post_isdeleted == false
                  select new
                  {
                      p.post_id
                  }).ToList();
    }           
}

是否可以返回IEnumerable对象?

5 个答案:

答案 0 :(得分:3)

您不需要使用任何To [Anything]方法或类似的东西。你的错误是你选择的方式。正确的代码是:

public static IEnumerable<int> GetAnswersIDs(int id)
{
    using (var context = new MvcApplication4.Entity.test2Entities1())
    {
        return (from p in context.post
                  where p.post_parentid == id && p.post_isdeleted == false
                  select p.post_id);
    }           
}

如您所见,您创建了一个您不需要的匿名类,因为您只需要一个int值。

- 编辑 -

您将面临ObjectDisposed异常。如果您使用返回的IEnumerable对象,则需要使用GetAnswersIDs方法中的上下文。

因此,您可以返回List而不是IEnumerable,或者您应该从GetAnswersIDs方法中定义上下文。

这是List

的代码
public static List<int> GetAnswersIDs(int id)
{
    using (var context = new MvcApplication4.Entity.test2Entities1())
    {
        return (from p in context.post
                  where p.post_parentid == id && p.post_isdeleted == false
                  select p.post_id).ToList();
    }           
}

答案 1 :(得分:2)

我认为您应该使用ToArrayToListArray<T>List<T>实施IEnumerable<T>),因为当您返回时,会处理上下文,我几乎肯定如果你使用AsEnumerable将枚举本身留给以后的步骤,你会得到一个例外:

public static IEnumerable<int> GetAnswersIDs(int id)
{
    using (var context = new MvcApplication4.Entity.test2Entities1())
    {
        return (from p in context.post
                  where p.post_parentid == id && p.post_isdeleted == false
                  select p.post_id).ToArray();
    }           
}
顺便说一下,我认为在你的情况下使用linq比非linq版本更冗长:

public static IEnumerable<int> GetAnswersIDs(int id)
{
    using (var context = new MvcApplication4.Entity.test2Entities1())
    {
        return context.post.
          Where(p => p.post_parentid == id && !p.post_isdeleted).
          Select(p => p.post_id).
          ToArray();
    }           
}

作为旁注,您可能需要考虑重新格式化模型中的字段名称以符合naming convensions in .NET

答案 2 :(得分:1)

我认为您正在寻找AsEnumerable()

然而,在查看代码后,您必须完全实现查询的结果,因此使用ToList()是合适的 - 否则当您稍后尝试枚举结果时会出现异常,因为它会尝试访问处置数据库上下文中的数据库。

答案 3 :(得分:0)

我认为你不需要select new {} select p.post_id应该足够了!然后你可以用.AsEnumerable()

包围它

答案 4 :(得分:0)

对于基本IEnumerable返回,使用yield return