如何在运行时从匿名类型中选择特定的属性对象并对其进行表达式查询?

时间:2018-10-30 21:28:33

标签: c# entity-framework

我想做的有些棘手,但我希望有人能够帮助我。互联网上有很多人说我想完成的事情是不可能的,但是我没有什么可以松懈的。

我正在尝试基于某些谓词进行通用实体框架查询,假设某些对象是匿名的。这是我现在创建的类:

public static class QueryableExtensions
    {
        public static IQueryable<TEntity> IsValid<TEntity, TSelector>(this IQueryable<TEntity> entities,
            Func<TEntity, TSelector> selector) where TSelector : MyTypeToCheck
        {
            return entities.Where(QueryBuilder.For<TEntity>().IsValid(selector));
        }
    }

public class QueryBuilder<T>
    {
        public Expression<Func<T, bool>> IsValid(Func<T, MyTypeToCheck> myType)
        {
            return arg => myType(arg).PropVal1 != null & myType(arg).PropVal2 == false & myType(arg).PropVal3 != 0;
        }
    }

public static class QueryBuilder
{
    public static QueryBuilder<TEntity> For<TEntity>()
    {
        return new QueryBuilder<TEntity>();
    }
}

这样,当我想用​​多个不同的匿名对象在多个不同的地方过滤某些东西时,我只需要创建一个新的扩展方法,例如QueryableExtensions类中的方法,就可以开始了。这是调用事物时的示例代码:

dbContext.MyTypeToCheck
                    .GroupJoin(dbContext.ASecondEntityType, c => c.PropVal1, d => d.PropVal1, (c, s) => new {c, s})
                    .Select(t => new {t, v = t.s.FirstOrDefault()})
                    .IsValid(arg => arg.t.c)

不幸的是,由于参数是Func而不是Func的Expression,因此此调用将崩溃。有人知道我该怎么做吗?

感谢您的帮助!

0 个答案:

没有答案