IQueryable序列化(web api)

时间:2012-09-09 04:50:02

标签: serialization asp.net-web-api iqueryable

为什么这不起作用?:

        var surveys = db.Surveys.Where(s => s.Author.UserId == user.UserId);

        return from survey in surveys
               select new
               {
                   surveyId = survey.SurveyId,
                   title = survey.Title
               };

这一点,经过微小的改变,是?:

        var surveys = db.Surveys.Where(s => s.Author == user);

        return from survey in surveys
               select new
               {
                   surveyId = survey.SurveyId,
                   title = survey.Title
               };

抛出序列化错误

The 'ObjectContent`1' type failed to serialize the response body for content type 
'application/xml; charset=utf-8'.  (...)




我很好解决这个问题,但我在这里(下面)有同样的错误,并且不能以同样的方式解决它:

var surveys = db.Surveys.Where(s => s.AnswerableBy(user));

6 个答案:

答案 0 :(得分:1)

我最近遇到了这个问题,在我的情况下问题是我有实体框架创建的循环引用 - 模型优先(公司 - >员工 - >公司)。

我通过简单地创建一个只包含我需要的属性的视图模型对象来解决它。

答案 1 :(得分:1)

根据“处理循环对象引用”一节here on the Microsoft ASP.NET Web API website,将以下代码行添加到WebAPIConfig.cs文件的Register方法中(应该位于项目的App_Start文件夹中)。

        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);

该页面上有单独的指令用于处理XML解析。

答案 2 :(得分:0)

您看到的例外是一般情况,可能由多种因素引起。检查序列化异常的InnerException属性,以找出导致序列化失败的确切原因。

答案 3 :(得分:0)

您正在使用匿名对象。使其强类型化,序列化将起作用。

答案 4 :(得分:0)

最后,这与Linq to Entities vs Linq to Objects。

有关

某些LINQ查询无法转换为SQL(如使用方法:someCollection.Where(p => p.SomeMethod()== ...))。所以它们必须首先被翻译成内存(someCollection.ToList()。Where ...)

答案 5 :(得分:0)

我遇到了同样的问题。在我的情况下,错误是由我的Dbml文件中创建的表之间的关系引起的。一旦我从DBML文件中删除了该关系,它就可以了。我认为数据库关系无法序列化。