我有以下功能
public virtual ICollection<T> initData<T>(System.Data.Entity.DbSet<T> set, System.Linq.Expressions.Expression<Func<T, bool>> filter) where T : CModel<T>
{
var x = (from dc in set select dc);
if (!this.db.valid)
{
System.Linq.Expressions.Expression<Func<T, bool>> active = a => a.active;
filter = (Expression<Func<T, bool>>)Expression.Lambda(Expression.AndAlso(filter, active));
x.Where(filter);
}
else
{
x.Where(filter);
}
return (ICollection<T>)x.ToList();
}
当我尝试将2个谓词与AndAlso
组合时,我会抛出异常:
The binary operator AndAlso is not defined for the types 'System.Func`2[namespace.Models.MyClass,System.Boolean]' and 'System.Func`2[namespace.Models.MyClass,System.Boolean]'.
我如何结合这两个条件?
答案 0 :(得分:1)
我认为你为自己的生活变得艰难。您可以多次使用Where扩展方法,如下所示:
public virtual ICollection<T> initData<T>(System.Data.Entity.DbSet<T> set, System.Linq.Expressions.Expression<Func<T, bool>> filter) where T : CModel<T>
{
var x = (from dc in set select dc);
x = set.Where(filter);
if (!this.db.valid)
{
x = x.Where(a => a.active);
}
return x.ToList();
}
请注意,在您的代码中,您使用了x.Where(filter);
这没用,因为Where不会改变x,所以结果基本上被丢弃了。
要保留结果,您需要将其分配给某些内容:
x = x.Where(filter);
。
这与您使用字符串时的想法相同。
第二个回答:
有一个名为Predicate<T>
的内置委托。我认为使用这种类型可能比Func<T, bool>
更有运气,尽管它们基本上具有相同的含义。我认为这就是编译器错误试图说的。