【问题标题】:Expression for complex type property复杂类型属性的表达式
【发布时间】:2015-10-03 18:22:40
【问题描述】:

我有一个场景,我从客户端网格的配置中动态创建 WHERE 子句。客户端将一些 json 发送到服务器,然后我对其进行解析并随后转换为表达式,以便可以将其作为 where 子句传递到存储库中。

目前我正在努力为复杂的属性类型创建表达式,比如这个:

public partial class Resource
{
  public string DisplayName { get; set; }
  public virtual ResourceType ResourceType { get; set; }
}

下面将转换为表达式的代码适用于 Displayname 属性等简单类型。表达式将类似于:

x => x.DisplayName == "ValueEnteredByUserInTheUI"

但是,当在网格中为 ResourceType 属性输入值时,表达式最终将类似于:

x => x.ResourceType == "ValueEnteredByUserInTheUI"

我缺少一个转换成这个的步骤:

 x => x.ResourceType.Name == "ValueEnteredByuserInTheUI"

任何人都可以在这里指出正确的方向吗?

public Expression<Func<T, bool>> GetExpression<TEntity>(string field, string operation, object value, string ignoreCase)
{
 Expression<Func<T, bool>> whereClause = default(Expression<Func<T, bool>>);

// Define lambda
ParameterExpression param = Expression.Parameter(typeof(T), "x");    
 MemberExpression member = Expression.Property(param, field);

 // Get property type
  Type propertyType = member.Type;

  // Get converter for type
   TypeConverter converter = TypeDescriptor.GetConverter(propertyType);

   // Convert property to type
   var result = converter.ConvertFrom(value.ToString());

   // Convert value to constant value
   ConstantExpression constant = Expression.Constant(result);

    Expression comparingExpression = default(BinaryExpression);
    switch (operation)
    {
      case "like":
           comparingExpression = Expression.Equal(member, Expression.Convert(constant, member.Type));
           break;           
       default:
           break;
   }

  var lambda = Expression.Lambda<Func<T, bool>>(comparingExpression, param);
   whereClause = whereClause == default(Expression<Func<T, bool>>) ? lambda : NewPredicateBuilder.And(whereClause, lambda);
        return whereClause;
  }

【问题讨论】:

  • 你是对的,这里的用词是错误的。我改变了问题。

标签: c# lambda expression navigation-properties


【解决方案1】:

显然没有很多人热衷于表达。无论如何,我已经为这个问题创建了一个解决方法。我在方法中添加了另一个参数,指示根对象的复杂属性的属性名称。

 // Get property of root object
 MemberExpression member = Expression.Property(param, field);

 // Get property of property
 MemberExpression memberField = Expression.PropertyOrField(member, complexProperty);

它的可扩展性和通用性都不是很高,但现在就可以了。

【讨论】:

  • 你将什么作为 complexProperty 传递?基本上你可以在你的答案中提供两者吗?如果你想更深入,你找到了答案吗?谢谢。
  • 这将是您的类的图形导航的点分隔字符串,例如“ResourceType.Name”,其中“ResourceType”是具有“Name”属性的类。不知道你说的更深入是什么意思。不久前,我在 GitHub 上上传了一个小项目:github.com/dimenics/dime-expressions。看看这是否适合您。
  • 你好 hbulens。感谢您的回复。我一定会看看您的链接。您的回答非常有效,我设法解决了我的问题。只是为了澄清。我的意思是更深入......想象一下像你的资源类这样的类。 'Resource.ResourceType.ResourceCode.Name',意思是资源代码是另一个对象,是你的 ResourceType 的一个属性。您将如何访问 ResourceCode.Name 属性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 2016-06-04
  • 1970-01-01
  • 2011-01-17
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多