Список запросов к словарю <string, object>, не может быть преобразован из объекта в исходный тип - PullRequest
0 голосов
/ 09 февраля 2012

Мне нужна помощь в создании запроса linq для данных ниже:

List<Dictionary<string, object>> entityProps = new List<Dictionary<string, object>>();

        for (int i = 0; i < 10; i++)
        {
            entityProps.Add(new Dictionary<string, object>{
                {"prop1", Guid.NewGuid().ToString()},
                {"prop2","test"+i},
                {"prop3", i /0.5},
                {"prop4", i}
            });
        }

        string propName = "prop3"; // I can also get eny of prop 1-4
        int value = 65;            // here for prop2 I receive string e.g. "test3"
        entityProps.Where(p => p[propName] == value);

Я получаю следующую ошибку: Оператор '==' нельзя применить к операндам типа 'object' и 'int'

Я хочу динамически привести каждый объект к его типу, потому что в будущем я хочу использовать деревья выражений для построения лямбда-запроса во время выполнения для операции, которую я получаю (операции могут быть равны, меньше, больше ...).Если я построю дерево выражений, мне все равно нужно будет привести данные к исходному типу?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 10 февраля 2012

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

    public static bool CompareToObject<TSource>(TSource left, object right, Func<TSource, TSource, bool> predicate)
    {
        if (right is TSource)
            return predicate(left, (TSource)right);
        else
            return false;
    }

, который можно вызвать с помощью:

entityProps.Where(p => CompareToObject(p[propName], value, (x, y) => x == y));
0 голосов
/ 09 февраля 2012

Вы должны привести все переменные ValueType к объекту с оператором: (объект)

Но, я думаю, вы делаете это неправильно. Я бы использовал класс POCO вместо словаря.

0 голосов
/ 10 февраля 2012

Здесь проще всего использовать dynamic.Просто убедитесь, что сравнения, которые вам нужно будет выполнить, имеют смысл.

var query = entityProps.Where(p => (dynamic)p[propName] == value);

Готово.

Создание выражений, необходимых для этого, не будет тривиальной вещью.Я уверен, что для этого уже есть библиотеки, не изобретайте колесо, если вам не нужно, особенно если вы не знаете, как сделать это самостоятельно.

Более практичноподход будет заключаться в использовании некоторого отражения для вызова соответствующих методов и перехода оттуда.

0 голосов
/ 09 февраля 2012

Вы можете попробовать привести к int?:

entityProps.Where(p => p[propName] as int? == value);
...