如何在linq查询的where子句中比较泛型

时间:2018-11-23 12:13:04

标签: c# linq-to-entities

我现在想比较一下结构字符串

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”条件。实体   成员正在调用无效的属性或方法。

1 个答案:

答案 0 :(得分: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);

请注意,尽管这看起来很冗长,但这实际上是C#编译器始终为基于表达式树的谓词生成 的内容。因此:它对代码的实际性能并没有任何影响-它仍在做相同的事情。