繁体   English   中英

在非通用DbSet上应用动态构建的表达式

[英]Apply a dynamically-built expression on non-generic DbSet

我有以下情况:

  • 我在编译时有一个未知的DbSet,它是通过其类型获得的,例如:

     DbSet entities = _repository.Context.Set(myType) 
  • 我有一个给定类型的动态构建的表达式,

    Expression myFilter; //构建为myType的表达式,在运行时构建

如何将myFilter应用于entities ,以便基于myFilter过滤出实体?

以下是可能对您有帮助的代码:它最终创建了一个myType的IQueryable,该IQueryable实际上代表了类似SELECT * FROM YourMappedTable Wed Ed = 1的内容,但当然,您可以使用我为演示目的而构建的表达式表达。

class Program
{
    static void Main(string[] args)
    {
        using (var x = new DB01Entities ())
        {
            Type myType = typeof(Angajati);

            var setMethod = typeof(DB01Entities).GetMethods(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public).Where (a => a.Name == "Set" && a.IsGenericMethod).First ().GetGenericMethodDefinition ();

            var mySet = setMethod.MakeGenericMethod(myType);

            var realSet = mySet.Invoke(x, null);

            var param1 = Expression.Parameter(myType, "param1");

            var propertyExpresion = Expression.Property(param1, "Id");

            var idExpresssion = Expression.Constant(1);

            var body = Expression.Equal(propertyExpresion, idExpresssion);

            var lambda = Expression.Lambda(body, param1);

            var genericTypeCaster = typeof(Program).GetMethod("Caster", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).GetGenericMethodDefinition();

            var effectiveMethod = genericTypeCaster.MakeGenericMethod(myType);

            var filteredQueryable = effectiveMethod.Invoke(null, new Object[] {realSet, lambda });
        }
    }

    private static IQueryable<T> Caster <T> (DbSet<T> theSet, Expression whereCondition) where T : class
    {
        return theSet.Where(whereCondition as Expression<Func<T, bool>>);
    }
}

因此,上面的“ lambda”变量与“ myFilter”等效。 它必须在运行时

Expression<Func<YourType, bool>>.

而mySet是您的“实体” DbSet。编码愉快!

暂无
暂无

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

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