1

我有以下功能

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 个谓词与AndAlsoi 结合时都会引发异常:

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]'.

我怎样才能结合这两个条件?

4

1 回答 1

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>,即使它们本质上具有相同的含义。我认为这就是编译器错误想要表达的意思。

于 2013-02-10T11:09:41.730 回答