В Entity Framework, если у вас есть объект, в котором одно или несколько его свойств используют отложенную загрузку, проверьте его имя типа времени выполнения с помощью GetType (). Name. Например, для объекта класса Car вы заметите, что тип среды выполнения на самом деле называется CarProxy , который является временным типом в памяти, созданным Entity Framework с использованием отражение . Базовый тип этого «поддельного» прокси-класса - Car , и имеет все оригинальные свойства Car , но включает в себя дополнительный, называемый LazyLoader для свойств, которые могут в нем нуждаться .
Если вы продолжите проверку этого «поддельного» типа CarProxy , вы также увидите, что Assembly.IsDynamic = true , что указывает на то, что класс был создан динамически с использованием отражения (см. документация ):
var TheCar = DBContext.Cars.Find(1);
Console.WriteLine(TheCar.GetType().Assembly.IsDynamic.ToString()); //will echo "true"
К счастью, Newtonsoft.Json имеет переопределение для метода JsonConvert.SerializeObject () , которое позволяет нам предоставлять базовый тип, так что результирующий JSON не содержит свойств которые не существуют в этом типе. Итак, чтобы исключить свойство LazyLoader , просто укажите BaseType объекта в качестве параметра типа:
var TheCar = DBContext.Cars.Find(1);
var TheJSON = Newtonsoft.Json.JsonConvert.SerializeObject(TheCar, TheCar.GetType().BaseType);
Чтобы убедиться, что вы не получаете циклические эталонные циклы при сериализации (очень высокая вероятность при использовании отложенной загрузки), вызовите сериализатор со следующей настройкой:
var TheCar = DBContext.Cars.Find(1);
var Settings = new Newtonsoft.Json.JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
};
var TheJSON = Newtonsoft.Json.JsonConvert.SerializeObject(TheCar, TheCar.GetType().BaseType, Settings);
Примечание: Это может работать только на первом уровне, когда сериализатор проходит через объект. Если есть еще более ленивые дочерние свойства объекта, который вы предоставляете сериализатору, свойство LazyLoader может появиться снова. Я не проверял, поэтому не могу сказать наверняка.