Как сравнить дженерики в предложении where в запросе linq

2

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

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". Член сущности вызывает недопустимое свойство или метод.

  • 2
    В качестве общего замечания о читабельности кода - ValueType - плохой выбор для параметра универсального типа - читателя очень запутывает, означает ли это «универсальный тип» против System.ValueType - честно говоря, я бы, вероятно, просто использовал T :)
  • 0
    можно спросить о contacts[propertyName] - что это? propertyName это обычное имя свойства здесь? contacts[propertyName] используют собственный индексатор?
Показать ещё 2 комментария
Теги:
linq-to-entities

1 ответ

1

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

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);

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

  • 0
    Спасибо Марк за решение! Но когда Expression.Equal () выполняется, он выдает System.ArgumentException: '' emailaddress1 'не является членом типа' Microsoft.Xrm.Sdk.Entity ''
  • 0
    @SergeyAslanov и это будет правильно! Итак: что на самом деле является вашим объектом? по-видимому, это подтип Entity поэтому используйте его; Я предполагаю Contact или что-то? Есть почти наверняка способы сделать это, не зная заранее типа - я бы ожидал, что возвращаемый тип OrganizationContext.CreateQuery имеет что-то вроде свойства EntityType или аналогичного, который вы могли бы использовать здесь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню