今天我的代码遇到了一个小问题。我有一个类似于以下的HttpGet
方法:
[HttpGet]
public IEnumerable<SomeEntity> Get()
{
return db.SomeEntity.ToList();
}
其中SomeEntity
可以表示为
public class SomeEntity
{
#region DatabaseColumns
[Key]
public int SomeEntityID { get; set; }
public string SomeEntityName { get; set; }
#endregion
#region Navigation Properties
public virtual ICollection<SomeChildEntity> SomeChildEntity { get; set; }
#endregion
}
我注意到return db.SomeEntity.ToList();
只返回了对象的顶级成员(而不是导航属性)。
考虑到我没有打电话给Include
,这对我有意义。出于好奇,我尝试了以下方法:
[HttpGet]
public IEnumerable<SomeEntity> Get()
{
var enumeratedEntity = db.SomeEntity.ToList();
return enumeratedEntity;
}
令我惊讶的是,它返回了整个实体及其导航属性。
我还注意到这些行中的HttpGet
也返回了整个对象
[HttpGet]
public SomeEntity Get(int id)
{
return db.SomeEntity.Find(id);
}
有人可以解释,或指向我将解释的资源,为什么这些方法在不使用Includes
方法的情况下返回整个对象而第一个方法没有?
答案 0 :(得分:0)
我不是百分之百,所以请随意测试,然后向上或向下投票。当您返回for /f "tokens=*" %%G in (%userprofile%\loctest.txt) do (set testvar=%%G)
时,您不会定义具体类型。您将返回一些通用IEnumerable,然后HTTP管道将虚拟属性剥离出来。
当您致电IEnumerable<SomeEntity>
时,您会创建一个列表。然后,该具体对象将立即实例化虚拟属性。然后,整个具体对象沿管道发送,包括虚拟属性。
您可以通过将var enumeratedEntity = db.SomeEntity.ToList();
更改为var enumeratedEntity = db.SomeEntity.ToList();
和IEnumerable<SomeEntity> enumeratedEntity = db.SomeEntity.ToList();
来对此进行测试。然后,您希望根据您使用的通用容器查看目前看到的2种行为。