Для утилиты, над которой я работаю, клиент хотел бы иметь возможность генерировать графические отчеты по собранным данным. Я уже могу сгенерировать пару готовых графиков (используя ZedGraph, очень приятная библиотека); однако утилита была бы намного более гибкой, если бы графики были более программируемыми или настраиваемыми конечным пользователем.
TLDR версия
Я хочу, чтобы пользователи могли использовать что-то вроде SQL для безопасного извлечения и выбора данных из списка объектов, которые я предоставляю и могу описать. Какие бесплатные инструменты или библиотеки помогут мне в этом?
Полная версия
Я задумался об использовании IronPython, IronRuby и LuaInterface, но, честно говоря, все они немного подавлены тем, что я хочу сделать. Мои классы довольно просты:
class Person:
string Name;
int HeightInCm;
DateTime BirthDate;
Weight[] WeighIns;
class Weight:
int WeightInKg;
DateTime Date;
Person Owner;
(точные классы были изменены, чтобы защитить невинных).
Чтобы получить данные для графика, пользователь сам выберет, является ли он гистограммой, точечной диаграммой и т. Д., А затем для фактического получения данных я хотел бы просто получить какой-то список от пользователя. ввод чего-то SQL-кода в соответствии с
SELECT Name, AVG(WeighIns) FROM People
SELECT WeightInKg, Owner.HeightInCm FROM Weights
И в качестве бонуса было бы неплохо, если бы вы могли на самом деле выполнять операции:
SELECT WeightInKg, (Date - Owner.BirthDate) AS Age FROM Weights
DSL никоим образом не должен соответствовать SQL; он даже не должен напоминать SQL, но я не могу придумать более эффективный описательный язык для этой задачи.
Я хорошо заполняю пробелы; Я не ожидаю, что библиотека сделает для меня всего . То, что я ожидал бы существовать (но не смог найти никоим образом, формы или формы), это что-то вроде Fluent NHibernate (который я уже использую в проекте), где я могу объявить отображение, что-то вроде
var personRequest = Request<Person>();
personRequest.Item("Name", (p => p.Name));
personRequest.Item("HeightInCm", (p => p.HeightInCm));
personRequest.Item("HeightInInches", (p => p.HeightInCm * CM_TO_INCHES));
// ...
var weightRequest = Request<Weight>();
weightRequest.Item("Owner", (w => w.Owner), personRequest); // Indicate a chain to personRequest
// ...
var people = Table<Person>("People", GetPeopleFromDatabase());
var weights = Table<Weight>("Weights", GetWeightsFromDatabase());
// ...
TryRunQuery(userInputQuery);
LINQ - это , поэтому близко к тому, что я хочу сделать, но AFAIK, нет никакого способа изолировать его. Я не хочу предоставлять какой-либо ненужный функционал конечному пользователю; То есть я не хочу, чтобы пользователь мог отправлять и обрабатывать:
from p in people select (p => { System.IO.File.Delete("C:\\something\\important"); return p.Name })
Так кто-нибудь знает о каких-либо бесплатных библиотеках .NET, которые позволяют что-то вроде того, что я описал выше? Или есть какой-нибудь способ песочницы LINQ? cs-script
тоже близко, но пока не предлагает песочницу. Я бы не хотел выставлять интерфейс NHibernate, так как пользователь должен иметь доступ к данным только для чтения на данном этапе использования.
Я использую C # 3.5, и предпочтение отдается чистым решениям .NET.
Суть в том, что я действительно стараюсь не писать свой собственный синтаксический анализатор для подмножества SQL, которое применимо только к этому единственному проекту.