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

30 浏览
0 Comments

使用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 Execute(IQueryable original, string propertyName)
   {
      return RequestExactMatch()
         ? original.Where(o => GetProperty(o, propertyName) == Name)
         : original.Where(o => GetProperty(o, propertyName).Contains(Name));
   }
}

但是GetProperty无法转换为查询。所以我想动态选择使用"propertyName"作为列名。

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

这样做可能吗?提前感谢。

0
0 Comments

原因:问题的出现是因为在使用LINQ to Entities(EF6)时,需要动态选择列名,但是无法直接在LINQ查询中使用字符串来选择列名。

解决方法:通过使用Expression类,可以动态创建Expression>,其中T是实体类型。代码中首先使用Expression.Parameter方法创建一个表示实体类型的参数,然后使用Expression.PropertyOrField方法创建一个表示属性或字段的表达式。接下来,根据需求使用Expression.Equal或Expression.Call方法创建一个表示等于或包含的表达式。最后,使用Expression.Lambda方法将表达式转换为Lambda表达式,并将其作为参数传递给original.Where方法来实现动态选择列名的查询。

对于日期,可以通过在数据库部分截断时间部分来仅比较日期。可以使用转换函数或类型转换来实现。根据提供的参考链接,可以找到具体的实现方法。

0