C# 为什么在没有导航属性的情况下序列化我的响应?
今天我的代码遇到了一个小问题。我有一个类似于以下内容的C# 为什么在没有导航属性的情况下序列化我的响应?,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,今天我的代码遇到了一个小问题。我有一个类似于以下内容的HttpGet方法: [HttpGet] public IEnumerable<SomeEntity> Get() { return db.SomeEntity.ToList(); } [HttpGet] public IEnumerable<SomeEntity> Get() { var enumeratedEntity = db.SomeEntity.ToList(); return en
HttpGet
方法:
[HttpGet]
public IEnumerable<SomeEntity> Get()
{
return db.SomeEntity.ToList();
}
[HttpGet]
public IEnumerable<SomeEntity> Get()
{
var enumeratedEntity = db.SomeEntity.ToList();
return enumeratedEntity;
}
我注意到返回db.SomeEntity.ToList()代码>仅返回对象的顶级成员(而不是导航属性)
考虑到我没有调用Include
,这对我来说是有意义的。出于好奇,我尝试了以下几点:
[HttpGet]
public IEnumerable<SomeEntity> Get()
{
return db.SomeEntity.ToList();
}
[HttpGet]
public IEnumerable<SomeEntity> Get()
{
var enumeratedEntity = db.SomeEntity.ToList();
return enumeratedEntity;
}
有人能解释一下,或者给我指一下将要解释的参考资料,为什么这些方法不使用Includes
方法而返回整个对象,而第一个方法不使用?我对此不是100%,请随意测试,然后向上或向下投票给我。当您返回一个IEnumerable
时,您没有定义具体的类型。您将返回一些通用IEnumerable,然后HTTP管道会从中剥离虚拟属性
调用var enumeratedEntity=db.SomeEntity.ToList()时代码>创建一个列表。然后,该具体对象立即实例化虚拟属性。然后将整个具体对象发送到管道中,包括虚拟属性
您可以通过更改var enumeratedEntity=db.SomeEntity.ToList()来测试这一点
toIEnumerable EnumerateIdentity=db.SomeEntity.ToList()代码>和列表EnumerateIdentity=db.SomeEntity.ToList()代码>。然后,您将看到当前基于您使用的通用容器看到的两种行为。第一种行为是否有子实体?如果没有,则该属性将被忽略。是的,在这两种情况下,它们都有子实体。很高兴知道,谢谢!您是否禁用了延迟加载?您没有包含导航属性,因此它们为空。即使启用了延迟加载,我认为依靠序列化程序为您获取导航属性也不是一个好主意。在序列化结果之前,应该特别使用.Include()并处理跟踪上下文。var enumeratedEntity=db.SomeEntity.ToList()
与List enumeratedEntity=db.SomeEntity.ToList()完全相同代码>到编译器。不完全正确。Var将创建一个变量,该变量取决于所讨论方法的返回类型。在这个实例中,ToList()返回一个列表是正确的。但这种创造发生在幕后,对开发者是隐藏的。ToQueryable()将返回一个IQueryable(),因此var将创建它。将EnumerateIdentity显式定义为一个列表可以消除任何潜在的歧义ToList()
始终返回一个列表
它不能返回任何其他内容。因此,对编译器来说,它们是完全相同的。