【问题标题】:Entity Framework dynamic linq where from generic source with dynamic where clause实体框架动态 linq where 来自具有动态 where 子句的通用源
【发布时间】:2021-08-19 10:11:48
【问题描述】:

当表名未知时,我正在尝试查询具有泛型类型的实体框架 where 子句语句。

我正在尝试使用动态 linq:

public static IEnumerable<T> wherePost<T>(this IEnumerable<T> source,
            string predicate) where T : class
{    
    using (var context = new dbEntities())
    {
        string exp = predicate;//driverId>3
        var p = Expression.Parameter(typeof(T));
        var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, exp);    
    }
}

这是 wherePost 的调用示例

 db.Drivers.wherePost("City == \"Paris\"");

不确定如何继续并使用DynamicExpression 从实体框架查询DbSet&lt;T&gt;

【问题讨论】:

  • 是未知的CLR实体类型吗?
  • 它被称为我们传递它 =>this IEnumerable 源。 .我们需要使用 linq 将实体查询到仅在运行时才知道的表。

标签: c# entity-framework linq generics dynamic-linq


【解决方案1】:

我假设您不需要即时更改 TableName,只需通过过滤器查询表即可。

public static IQueryable<T> wherePost<T>(this IQueryable<T> source,
    string predicate) where T : class
{    
    string exp = predicate;//driverId>3
    var p = Expression.Parameter(typeof(T));
    var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, exp);    
    var whereExpr = Expression.Call(typeof(Queryable), nameof(Queryable.Where), new[] { typeof(T) }, source.Expression, e);

    return source.Provider.CreateQuery<T>(whereExpr);
}

及用法:

db.Drivers.wherePost("City == \"Paris\"").ToList();

【讨论】:

  • 我得到的 'IEnumerable' 不包含 'Expression' 的定义,并且没有可访问的扩展方法 'Expression' 接受类型为 'IEnumerable' 的第一个参数(您是否缺少 using 指令或程序集引用?)
  • 应该是IQueryable
猜你喜欢
  • 2010-10-06
  • 1970-01-01
  • 2021-04-16
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多