将实体框架对象作为JSON返回

Cit*_* SP 3 c# asp.net-mvc json entity-framework asp.net-mvc-4

我尝试在我的Controller中使用以下方法将实体框架对象作为Json返回:

  public JsonResult EventList() {
        var results = from s in db.Events
                      select new
                      {
                          OrderID = s.EventID,
                          OrderTitle =s.EventType,
                          OrderDate = s.Title
                      };

return Json(results);
}
Run Code Online (Sandbox Code Playgroud)

进入页面/ events/EventList /时,我收到服务器错误500.此外,Jquery get请求不返回任何数据.以Json格式返回结果的正确方法是什么?

更新:

这似乎有效.但我需要数据库的结果.

   public ActionResult EventList() {

        Event test = new Event
        {
            EventID = 1,
            Title = "test",
            Description = "test"
        };

        return Json(new { event = test }, JsonRequestBehavior.AllowGet);
    }
Run Code Online (Sandbox Code Playgroud)

Cra*_*aig 9

新答案 - 2018年更新:

下面的原始答案每次都有效,如果你使用延迟加载,它可能仍然是最好的解决方案.但是,如果没有延迟加载,您可以执行以下操作Newtonsoft.JSON:

var settings = new JsonSerializerSettings()
    {
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        Error = (sender, args) =>
        {
            args.ErrorContext.Handled = true;
        },
    };

using(var context = new myContext())
{
    var myEntity = myContext.Foos.First();
    return JsonConvert.SerializeObject(myEntity, settings);
}
Run Code Online (Sandbox Code Playgroud)

这基本上将序列化实体框架请求中包含的任何内容,同时忽略任何错误和引用循环.

这种方法的缺点是什么控制序列得到比较难,如果你是有意识的表现,你可能需要开始像图案装饰您生成的实体框架类

// a new partial class extending the Foo generated class, allowing us to apply an interface
[MetadataType(typeof(IFooMetaData))]
public partial class Foo : IFooMetaData
{
}

// meta data interface, forcing json ignore on Foo.Bars
public interface IFooMetaData
{
    [JsonIgnore]
    ICollection<Bar> Bars {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

原始答案 - 2015年:

可以得到这样的回应:

[
{
"OrderID": 1
},
{
"OrderID": 2
},
{
"OrderID": 3
}
]
Run Code Online (Sandbox Code Playgroud)

由此:

    public JsonResult Test()
    {
        var events = new List<Event>()
        {
            new Event() {EventId = 1},
            new Event() {EventId = 2},
            new Event() {EventId = 3}
        };


        var results = events.Select(e => new
        {
            OrderID = e.EventId
        }).ToList();

        return new JsonResult() { Data = results, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }
Run Code Online (Sandbox Code Playgroud)

所以你的应该是这样的

    public JsonResult Test()
    {
        var results = db.Events.Select(e => new
        {
            OrderID = e.EventId
        }).ToList();

        return new JsonResult() { Data = results, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }
Run Code Online (Sandbox Code Playgroud)

编辑

使用经过测试的代码重新发布