2009-11-04 2 views
1

Мы пытаемся сериализовать некоторые данные, а один из элементов в коллекции - это «оператор отложенного исполнения linq» (на самом деле это результат вызова Concat в коллекции).Стойкость отсроченного исполнения выражения linq

Проблема в том, как сохранить этот объект. Он не поддерживает ISerializable. Фактический тип - это что-то вроде строк System.Linq.Enumerable.WhereSelectListIterator <>

Просто интересно, кто-то столкнулся с этим раньше и каким было решение.

+2

Вы не можете выполнить запрос ('ToList',' ToArray') и сериализовать результат? –

ответ

2

Вы можете позвонить ToList() в оператор Linq; это соберет все результаты и вернет их в List<T>, которые затем можно сериализовать.

+0

Спасибо за ответ. Да, это вариант. Проблема в том, что рассматриваемый класс является шаблоном, а выражение - тем, что получает в качестве шаблонного аргумента (что может быть что угодно). Таким образом, это не похоже на то, что мы можем называть ToList(). Мы должны назвать это классом, который предоставляет список, что не является самым оптимальным решением. Но это лучшее, что мы придумали до сих пор. – 2009-11-06 12:54:19

1

Если запрос и их сериализация не является вариантом, вам придется вручную сериализовать запрос каким-либо образом.

Одна из проблем заключается в том, что существует слишком много разных типов объектов запроса LINQ. И все эти типы являются внутренними для структуры. Это довольно сильно блокирует вас.

Однако может быть решение для вашего конкретного случая. Если единственным типом запроса, который требуется для сериализации, является результат вызова Concat, решение может быть не слишком сложным. Все зависит от собираемых вами коллекций и того, как вы (или хотите) их сериализовать.

+1

Если запрос был построен на IQueryable вместо IEnumerable, это было бы проще. –

+0

@Martinho: +1 Действительно! Сериализация лямбда-выражений проще, чем сериализация скомпилированного делегата – jpbochi

+0

Спасибо за ответ. К сожалению, сохраняемый элемент - это шаблонный аргумент, так что это может быть что угодно. Самое простое решение, к которому мы должны стремиться, - перейти к классу, предоставляющему этот аргумент, и просто вызвать ToList() на нем (который мы можем сериализировать просто отлично). Мы могли бы потенциально перечислить выражение и перенести каждый элемент, но у нас возникла бы проблема со стороны загрузки, определяющая, какой объект должен создавать экземпляр. – 2009-11-06 13:02:51

Смежные вопросы