Сериализация и десериализация деревьев выражений в C #

92

Есть ли способ десериализации выражений в C #, я хотел бы хранить выражения в базе данных и загружать их во время выполнения.

Александр Бризебуа
источник
какие выражения? Регулярное выражение?
Джон Лимджап,
16
Я бы предположил выражения типа System.Linq.Expression, учитывая "деревья".
Дэвид Венгер,
1
вы можете использовать codeproject.com/Articles/851187/…
Мохаммад Дайян

Ответы:

48

Я продолжил работу над библиотекой, о которой упоминалось в разделе «Сериализация и десериализация деревьев выражений в C #».

Похоже, что проект был заброшен (2008 г.), но я немного поработал над ним, и теперь он работает с .NET 4.0 и Silverlight. Я исправил ошибки в их коде, а также сделал его более независимым от DAL.

http://expressiontree.codeplex.com/

Т. Вебстер
источник
2
+1 за то, что нашел рабочее решение. Я попытался использовать исходную библиотеку в MSDN, и она не смогла десериализовать простой узел двоичного выражения. Ваш проект отлично работает. Благодарность!
Jacobs Data Solutions
2
Это проект на Nuget?
Мохаммад Дайян
@MohammadDayyan, Microsoft была нерешительна и непоследовательна в отношении своего инструмента управления пакетами. Иногда пакеты ASP.NET CORE можно установить с помощью Nuget, в других случаях, например, драйвер MongoDB не будет доступен через NuGet. Тем не менее, по крайней мере, у Microsoft было понимание, позволяющее NPM управлять пакетами. Скорее всего, поставлю это на NPM
Т. Вебстер
@RepoMan: решение проблемы для меня гораздо дороже, когда это кому-то помогает. Может быть, вы можете предоставить какую-нибудь документацию по использованию - давайте поговорим ..
Т. Вебстер
14

Другой вариант - это проект сериализации дерева выражений на code.msdn.com - может показаться, что здесь нужно больше?

UPD: Теперь http://archive.msdn.microsoft.com/exprserialization

Богатый
источник
Код сериализации дерева выражений удален из галереи кода code.msdn.microsoft.com/exprserialization , есть идеи, куда он перемещен, или лучшие альтернативы?
Kiran Bheemarti
@ Киран: Что ты имеешь в виду? Загрузка кода все еще существует; проверьте вкладку загрузок вверху страницы.
Роберт Харви
Да, сейчас это, вероятно, временное явление. Вчера, когда я попробовал ссылку выше, страница выкидывала ошибку «проект не найден». Я вижу проект и скачиваю сейчас. Благодарность!!!
Kiran Bheemarti
13

На GitHub / Nuget есть проект MetaLinq , цель которого упростить работу с выражением tress.

Он преобразуется между обычными выражениями и «EditableExpressions», которые являются изменяемыми и полностью сериализуемыми, поэтому могут использоваться с Json, Xml, Binary и т. Д.

Также проверьте это сообщение в блоге для получения дополнительной информации.

Поп-каталин
источник
12

взгляните на мою новую библиотеку Serialize.Linq . Он сериализует выражения linq в json, xml и двоичные файлы.

эскар
источник
вы использовали это раньше? Каким был ваш опыт / какие ограничения?
Alexandre Brisebois
Я использовал аналогичную версию в своем последнем проекте. работает хорошо.
esskar
Зачем писать что-то, что еще больше размывает линии между уровнями? Вы продвигаете раскрытие объектов домена DAL в BAL ... если ваша библиотека каким-то образом автоматически не преобразует DTO (и запросы к ним) в объекты / запросы домена. Я не вижу в документации ничего, указывающего на такое поведение.
M.Babcock
@ M.Babcock: то, что вы хотите использовать в своих выражениях DTO vs Entities, не является частью логики библиотеки.
esskar 09
4
@esskar ваш блог / весь сайт, кажется, исчез. он переехал?
Джон
3

Не полностью; однако пример Dynamic LINQ может немного помочь. Вы, конечно, можете сериализовать выражение в строку (до некоторой степени - универсальные шаблоны выглядят немного странно), но встроенного парсера нет.

Марк Гравелл
источник
Я не могу понять, как сериализовать выражение в строку, используя образец, только в другом направлении, чтобы взять его за строку и создать дерево выражения. Какой метод мне вызвать?
Кристофер Эдвардс,