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

标签 c# entity-framework linq-to-entities entity-framework-6

我想封装使用 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<Func<T, bool>>使用 Expression像这样上课:

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

关于c# - 使用 Linq to Entities (EF6) 动态选择列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31302196/

相关文章:

c# - "Invalid attempt to read when no data is present"在对查询结果启动 foreach 循环时

c# - Linq-to-entities orderby 给出不明确的列名错误

c# - 将类添加到已编译的程序集中(在内存中)

C# 使用函数添加到元组列表

c# - “Code First From Database”模板未显示在 Visual Studio 实体数据模型向导中

linq - 如何使用 DbContext 更新对象?

c# - 不允许新事务,因为 session 中还有其他线程在运行 LINQ To Entity

c# - 比较where子句中的日期部分

c# - 我可以向现有静态类添加扩展方法吗?

c# - 创建由其他 ECDSA 证书签名的 ECDSA 证书