Serialization IQueryable序列化(web api)

Serialization IQueryable序列化(web api),serialization,asp.net-web-api,iqueryable,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 = surve

为什么这不起作用

        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));

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

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

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


我只需创建一个仅具有所需属性的视图模型对象即可解决此问题。

根据“处理循环对象引用”一节,将以下代码行添加到WebAPIConfig.cs文件的Register方法(应位于项目的App_Start文件夹中)


该页面上有单独的说明,用于处理XML解析

最后,这与Linq到实体与Linq到对象有关


某些LINQ查询无法转换为SQL(例如使用方法:someCollection.Where(p=>p.SomeMethod()==…)。因此,必须首先将它们转换为内存(someCollection.ToList()。其中…)

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

“Type”System.Linq.Enumerable+whereselectEnumerableTerator
2[MySln.Models.Survey,f_u匿名类型0
2[System.Int32,System.String]]不能序列化。请考虑用DATACONTractAttor属性标记它,并标记您想用DATAMEMBAREATE属性序列化的所有成员。如果该类型是一个集合,请考虑用CopeDeDATAcNoTractAttor标记它。请参阅其他支持类型的微软.NETFramework文档。但是我不想序列化一个“调查”,而是这个属性的一个子集(这就是我使用动态编辑的原因):好的,谢谢,问题是IsAnswerable(·)无法转换为LINQ查询。现在我真的不知道如何在不修改架构的情况下解决这个问题,该死。一个常见的技巧是在调用链中添加
ToList
调用。这迫使LINQ执行查询并提取内存中的所有数据。例如:
var surveys=db.surveys.ToList(),其中(s=>s.AnswerableBy(user))我必须补充一点,将查询执行从LINQ转移到SQL再转移到LINQ到对象有一些明显的缺点。在大多数情况下,由于SQL能够更好地管理查询,您将失去性能。如果您的
调查
表将包含数百万行,那么在应用筛选器之前将所有数据提取到内存中是一个低效的解决方案。哇,这很有帮助!谢谢你,马丁·德维勒斯。我确实会有数百万行,但现在我对一个干净的代码很满意。如果你想的话,你甚至可以做一个字典。然后,我对webapi的响应是json,但是,对我来说更好。也许有更多的解释如何以及为什么这样解决问题是合适的。这对我来说似乎并不明显。
        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);