繁体   English   中英

使用Linq to Entities(EF6)动态选择列名

[英]Dynamically select column name using Linq to Entities (EF6)

我想在使用EF6时封装常见的场景。 这是一个例子:

   public class StringRequest : DbRequestProperty
   {
      public string Name { get; set; }
      public bool? ExactMatch { get; set; }

      protected override bool IsValid()
      {
         return !string.IsNullOrWhiteSpace(Name);
      }

      private bool RequestExactMatch()
      {
         return ExactMatch.HasValue && ExactMatch.Value;
      }

      protected override IQueryable<T> Execute<T>(IQueryable<T> original, string propertyName)
      {
         return RequestExactMatch()
            ? original.Where(o => GetProperty<string>(o, propertyName) == Name)
            : original.Where(o => GetProperty<string>(o, propertyName).Contains(Name));
      }
   }

但GetProperty无法转换为查询。 所以我正在考虑使用“propertyName”动态选择列。

  protected override IQueryable<T> Execute<T>(IQueryable<T> original, string propertyName)
  {
     return RequestExactMatch()
        ? original.Where(o => GetColumnByName<string>(propertyName) == Name)
        : original.Where(o => GetColumnByName<string>(propertyName).Contains(Name));
  }

这可能吗? 提前致谢。

您可以使用Expression类动态创建Expression<Func<T, bool>> ,如下所示:

protected override IQueryable<T> Execute<T>(IQueryable<T> original, string propertyName)
{
   var parameter = Expression.Parameter(typeof(T));
   var property = Expression.PropertyOrField(parameter, propertyName);
   var constant = Expression.Constant(Name);

   Expression predicate;
   if(RequestExactMatch())  
   {     
      predicate = Expression.Equal(property, constant);    
   }
   else 
   {
      predicate = Expression.Call(property, "Contains", null, constant);    
   }

   var lambda = Expression.Lambda<Func<T, bool>>(predicate, parameter);

   return original.Where(lambda);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM