其他分享
首页 > 其他分享> > CodeGo.net>我如何建立一个Linq表达式树与一个通用对象比较?

CodeGo.net>我如何建立一个Linq表达式树与一个通用对象比较?

作者:互联网

我有一个IQueryable和一个T类型的对象.

我想做IQueryable().在哪里(o => o.GetProperty(fieldName)== objectOfTypeT.GetProperty(fieldName))

所以…

public IQueryable<T> DoWork<T>(string fieldName)
        where T : EntityObject
{
   ...
   T objectOfTypeT = ...;
   ....
   return SomeIQueryable<T>().Where(o => o.GetProperty(fieldName) == objectOfTypeT.GetProperty(fieldName));
}

没错,GetProperty不是有效的函数.我需要执行此功能的东西.

我是星期五下午脑袋融化了吗,或者这是一件复杂的事情?

objectOfTypeT我可以执行以下操作…

var matchToValue = Expression.Lambda(ParameterExpression
.Property(ParameterExpression.Constant(item), "CustomerKey"))
.Compile().DynamicInvoke();

完美运行,现在我只需要第二部分:

返回SomeIQueryable().Where(o => o.GetProperty(fieldName)== matchValue);

解决方法:

像这样:

    var param = Expression.Parameter(typeof(T), "o");
    var fixedItem = Expression.Constant(objectOfTypeT, typeof(T));
    var body = Expression.Equal(
        Expression.PropertyOrField(param, fieldName),
        Expression.PropertyOrField(fixedItem, fieldName));
    var lambda = Expression.Lambda<Func<T,bool>>(body,param);
    return source.Where(lambda);

我已经开始创建一个博客,其中涉及许多表达主题,分别为here.

如果遇到任何问题,另一种选择是先从objectOfTypeT中提取值(使用反射),然后在Expression.Constant中使用该值,但我怀疑按原样可以.

标签:generics,linq,c,entity-framework,expression-trees
来源: https://codeday.me/bug/20191108/2004876.html