Как сравнить дженерики в предложении where в запросе linq - PullRequest
0 голосов
/ 23 ноября 2018

Сейчас я хочу сравнить строку структур

public Entity GetByPropertyValue<ValueType>(string propertyName, ValueType value)
{
    var contact = (from contacts in OrganizationContext.CreateQuery("contact")
                 where (ValueType)contacts[propertyName] == value
                 select contacts).FirstOrDefault();

    return contact;
}

, но проблема в следующем:

Оператор '==' нельзя применить к операндам типа 'ValueType'и 'ValueType'

Если сделать это иначе

where object.Equals((ValueType)contacts[propertyName], value)

, к сожалению, это не будет работать

System.NotSupportedException: недопустимое условие "где".Член сущности вызывает недопустимое свойство или метод.

1 Ответ

0 голосов
/ 23 ноября 2018

Вероятно, это сценарий, в котором ручное построение дерева выражений оправдано.Я не могу проверить это без вашего кода, но что-то вроде :

public Entity GetByPropertyValue<T>(string propertyName, T value)
{
    var p = Expression.Parameter(typeof(Entity));
    var body = Expression.Equal(
        Expression.PropertyOrField(p, propertyName),
        Expression.Constant(value, typeof(T)));
    var lambda = Expression.Lambda<Func<Entity, bool>>(body, p);

    return OrganizationContext.CreateQuery("contact").Where(lambda).FirstOrDefault();
}

последняя строка также может быть переписана:

return OrganizationContext.CreateQuery("contact").FirstOrDefault(lambda);

Обратите внимание, что покаэто может выглядеть многословно, на самом деле это то, что компилятор C # генерирует в любом случае для предиката на основе дерева выражений;Итак: это не оказывает никакого влияния на фактическую производительность кода - он все еще делает то же самое.

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