Я хочу сравнить строку структур сейчас
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: недопустимое условие "where". Член сущности вызывает недопустимое свойство или метод.
Это, вероятно, сценарий, в котором ручное построение дерева выражений оправдано. Я не могу проверить это без вашего кода, но что-то вроде:
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);
Обратите внимание, что хотя это может показаться многословным, на самом деле это то, что компилятор С# генерирует в любом случае для предиката на основе дерева выражений; Итак: это никак не влияет на реальную производительность кода - он все еще делает то же самое.
Entity
поэтому используйте его; Я предполагаю Contact
или что-то? Есть почти наверняка способы сделать это, не зная заранее типа - я бы ожидал, что возвращаемый тип OrganizationContext.CreateQuery
имеет что-то вроде свойства EntityType
или аналогичного, который вы могли бы использовать здесь
ValueType
- плохой выбор для параметра универсального типа - читателя очень запутывает, означает ли это «универсальный тип» противSystem.ValueType
- честно говоря, я бы, вероятно, просто использовалT
:)contacts[propertyName]
- что это?propertyName
это обычное имя свойства здесь?contacts[propertyName]
используют собственный индексатор?