我正在尝试返回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对象?
答案 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)
我认为您应该使用ToArray
或ToList
(Array<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