我想做的有些棘手,但我希望有人能够帮助我。互联网上有很多人说我想完成的事情是不可能的,但是我没有什么可以松懈的。
我正在尝试基于某些谓词进行通用实体框架查询,假设某些对象是匿名的。这是我现在创建的类:
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,因此此调用将崩溃。有人知道我该怎么做吗?
感谢您的帮助!