Простите меня, если это было задано раньше; Я не смог найти ничего близкого после нескольких поисков:Итерация по неизвестным свойствам IQueryable?
Я пытаюсь написать ActionFilter в MVC, который «перехватит» IQueryable и аннулирует все отношения родитель-потомок во время выполнения. Я делаю это, потому что Linq не упорядочивает объекты должным образом, если у них есть отношения родитель-потомок (он выдает циклическую опорную ошибку, потому что родитель ссылается на дочерний элемент, который ссылается на родителя и т. Д.), И мне нужен объект сериализован для Json для вызова Ajax. Я попытался маркировать дочерние отношения в файле DBML со статусом конфиденциальности внутреннего, и, хотя это исправляет проблему сериализации, он также скрывает дочерние элементы из механизма просмотра, когда страница отображается, в результате чего возникает другая ошибка. Итак, исправляя одну проблему, я вызываю другую.
Единственное, что устраняет обе проблемы, - это вручную установить дочерние элементы на нуль перед возвратом сериализации, но я стараюсь избегать этого, потому что это громоздко, не может использоваться повторно и т. Д. Я бы предпочел использовать ActionFilter для проверки IQueryable, который сериализуется и аннулирует любые члены с типом EntitySet (как представлены внешние ключи/ассоциации). Тем не менее, у меня нет большого опыта работы с Reflection и я не могу найти примеров, иллюстрирующих, как это сделать. Итак ... возможно ли это с Reflection? Есть ли лучший способ сделать то же самое? Завтра я отправлю соответствующий код, когда вернусь на рабочий компьютер.
Спасибо,
Daniel
Как обещанный код:
[GridAction]
public ActionResult _GetGrid()
{
IQueryable<Form> result = formRepository.GetAll();
foreach (Form f in result)
{
f.LineItems = null;
f.Notes = null;
}
return View(new GridModel<Form> { Data = result });
}
Добавленной морщин является то, что я использую новый MVC Telerik Extensions, так что я на самом деле не сериализует сам Json - я просто возвращаю IQueryable в IGridModel, а фильтр действий [GridAction] делает все остальное.