2009-03-26 2 views
1

Что бы быть лучшим подходом, чтобы позволить пользователям определять ГДЕ-подобные ограничения на объекты, которые определены следующим образом:Dynamic «ГДЕ» как запросы на память объекты

Collection<object[]> data 
Collection<string> columnNames 

где объект [] является единственным ряд.

Я думал о динамическом создании сильной типизированной оболочки и просто используя Dynamic LINQ, но, возможно, есть более простое решение?

DataSet на самом деле не вариант, поскольку коллекции довольно огромны (40 000+ записей), и я не хочу создавать DataTable и заполнять его каждый раз, когда я запускаю запрос.

ответ

4

Какие запросы вы хотите запустить? Если это просто равенство, что относительно легко:

public static IEnumerable<object[]> WhereEqual(
    this IEnumerable<object[]> source, 
    Collection<string> columnNames, 
    string column, 
    object value) 
{ 
    int columnIndex = columnNames.IndexOf(column); 
    if (columnIndex == -1) 
    { 
     throw new ArgumentException(); 
    } 
    return source.Where(row => Object.Equals(row[columnIndex], value); 
} 

Если вам нужно что-то более сложное, пожалуйста, дайте нам пример того, что вы бы как, чтобы иметь возможность написать.

0

Когда вы используете object, LINQ на самом деле не поможет вам ... это стоит боль? И Dynamic LINQ, безусловно, излишне. Каков ожидаемый способ использования этого? Я могу придумать несколько способов добавления базовых операций Where .... но я не уверен, насколько это было бы полезно.

-1

Я думаю о чем-то вроде этого:

((col1 = "а") или (col2 = "XYZ")) и (col3 = "123")

В конечном счете это будет Приятно иметь поддержку оператора LIKE с подстановочным знаком%.

+0

(Разве это не должно быть в вопросе, а не как ответ?) – Svish

0

Как насчет встраивания чего-то вроде IronPython в ваш проект? Мы используем это, чтобы пользователи могли определять свои собственные выражения (фильтры и прочее) внутри песочницы.

1

Если я получу вашу точку зрения: вы хотели бы, чтобы пользователи писали предложение where извне - я имею в виду, что пользователи являются настоящими пользователями, а не разработчиками, поэтому вы ищете решение для uicontrol, код, где находится мост условий. Я просто это объяснил, потому что вы упомянули dlinq.


Так что, если я правильно то, что вы хотите сделать, это на самом деле:

  • дает пользователю возможность использовать имена столбцов
  • дают возможность описать функцию Ей (которая будет служить, где критерии)
  • составить запрос динамически и запустить

Для решения этой задачи, позвольте мне предложить: правила от пространство имен System.Workflow.Activities.Rules. Для правил есть несколько дизайнеров, не говоря уже о тех, которые поставляются с Visual Studio (для Интернета это другой вопрос, но для этого тоже есть несколько). Я начал с Rules without workflow, а затем рассмотрел примеры из msdn. Это очень гибкий и настраиваемый движок.

Еще одна вещь: LINQ имеет подключение к этой проблеме, поскольку функция, возвращающая IQueryable, может отложить выполнение запроса, вы можете предварительно определить запрос, а в другой части кода можно расширить возвращаемый запрос на основе условия пользователя (который то могут быть закреплены с помощью методов расширения).

-1

Спасибо всем, ребята, я наконец нашел его. Он называется NQuery, и он доступен в CodePlex. В его документации есть даже пример, который содержит привязку к моей самой структуре - список имен столбцов + список объектов []. Плюс полностью функциональный механизм запросов SQL.

Просто отлично.

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