不返回来自db的数据,但是正常列表是

时间:2012-08-10 16:32:47

标签: c# asp.net entity-framework asp.net-web-api lazy-loading

我正在构建一个webapi,我有一个奇怪的问题。

当我做这样的事情时

List<Content> items = new List<Content>();

而不是我添加项目

items.Add(new Content());

而且我调用url localhost / api / Content / Get我会得到一个很好的xml与我的项目 但是当我做这样的事情时

public IEnumerable<Content> Get()
{
    List<Content> population = new List<Content>();
    Content[] test = new Content[5];

    var tmp = from c in db.Content select c;
    using (IEnumerator<Content> enumerator = tmp.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            Content ctmp = (Content)enumerator.Current;
            population.Add(ctmp);
        }
    }
    return population;
}

我调用相同的URL我得到空白(白色)页面。当我返回tmp变量时也一样。

更新

感谢您的帮助。主要问题仍然存在。为什么正常返回正常List并从db创建List isn`t。从DataProxies.Content到COntent的复制并不是我梦寐以求的解决方案,因为Jon注意到它有点奇怪。

db.Content.ToList()的所有样本都没有帮助:/我被认为是

3 个答案:

答案 0 :(得分:2)

可能您的SQL查询找不到任何项目,因此从该方法返回的列表为空。请注意,您的代码可以更简单地表达为:

public IEnumerable<Content> Get()
{
    return db.Content.ToList();
}

或可能:

public IEnumerable<Content> Get()
{
    return db.Content.Cast<Content>().ToList();
}

您需要向我们解释一下db.Content,以便我们为您提供更多帮助。也许你应该创建一个新的数据库上下文?例如:

public IEnumerable<Content> Get()
{
    using (FooDataContext db = new FooDataContext())
    {
        return db.Content.ToList();
    }
}

编辑:如果您确实想要确保您只是返回Content个对象,而不是动态代理,那么您可以编写如下内容:

public IEnumerable<Content> Get()
{
    using (FooDataContext db = new FooDataContext())
    {
        return db.Content
                 .ToList()
                 .Select(c => new Content { Name = c.Name,
                                            Foo =  c.Foo,
                                            // etc
                         });
    }
}

...只是直接复制属性。

答案 1 :(得分:1)

var list = db.Content.ToList();

答案 2 :(得分:1)

我找到了解决方案。至少我认为我做了

我用

db.Configuration.ProxyCreationEnabled = false;

我得到的普通对象不是代理动态实体

关于你的问题Jon。我如何暴露这种方法?没什么好说的。我从模板创建了ApiController,并且只编辑了方法

    public class ContentController : ApiController
{
    private signsEntities db = new signsEntities();

    // GET api/content
    public IEnumerable<Content> Get()
    {
        db.Configuration.ProxyCreationEnabled = false;
        Content[] test = this.db.Content.ToArray<Content>();
        return test;
    }
}

这是全班。你可以看到的不多:)