Использование библиотеки динамических запросов LINQ со словарем <string, object> и .AsQueryable () - PullRequest
6 голосов
/ 20 августа 2009

В одном из моих предыдущих вопросов об использовании динамически создаваемых строк (где-либо) и их использовании в LINQ я направлялся к библиотеке динамических запросов LINQ Dynamic LINQ .

Первая проблема заключалась в том, что она применяется только к IQueryable, однако это можно преодолеть с помощью метода расширения .AsQueryable () в любом IEnumerable.

Проблема, с которой я столкнулся, заключалась в том, что Dynamic LINQ ищет Свойство с именем «CustomerID» (или все, что было передано в строковый предикат для динамического linq) в моем Словаре. Что, очевидно, не сработает, поскольку в словаре есть только ключи и значения.

Поэтому, думая, что я умен, я создал класс, расширяющий : Dictionary<string, object>, ICustomTypeDescriptor`.

Это позволило мне переопределить GetProperties() для типа. Что здорово. Теперь я могу перебрать ключи словаря и добавить их в PropertyDescriptorCollection, который возвращается.

Но потом я столкнулся с другой проблемой. Во всей динамической библиотеке LINQ они работают с «экземпляром выражения», который содержит только тип. Но чтобы мое CustomTypeDescriptor решение работало, мне нужен фактический экземпляр типа, прежде чем я смогу применить TypeDescriptor.GetProperties(instance, false).

Итак, перейдем к актуальному вопросу. Принимая во внимание всю вышеуказанную информацию, как применить пользовательское предложение where в строковом формате "CustomerID = 1234 AND Количество> = 10000" к запросу LINQ, если данные хранятся в словаре с парами ключ-значение.

Мое текущее решение заключается в преобразовании данных в DataTable и использовании метода .Select(query). Что работает, но я заинтересован в поиске других решений. Специально для целей бенчмаркинга.

Есть идеи?

1 Ответ

2 голосов
/ 20 августа 2009

Во-первых - если вы обращаетесь к словарю таким образом, то вы не используете его как словарь - пробовали ли вы:

var qry = myDictionary.Values.AsQueryable().Where(sQuery);

(обратите внимание, что если вы используете object, вы, вероятно, захотите где-то там Cast<Customer> или OfType<Customer>)

В противном случае:

T в IEnumerable<T> (и, следовательно, также для IQueryable<T> после вызова метода расширения AsQueryable()) для Dictionary<TKey,TValue> равно KeyValuePair<TKey,TValue> - так что вы должны иметь возможность использовать Where("Value.CustomerID == 12345") или что-то еще похоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...