二进制运算符Or未定义类型'DAL.Tag'和'System.Boolean'

时间:2013-02-20 20:37:32

标签: c# linq entity-framework exception-handling

我创建了一个Generic Repository类,如下所示:

public abstract class Repository<TEntity, TIdentifier> : IRepository<TEntity, TIdentifier> where TEntity : class
{
    //TEntity is type of DBSet and TIdentifier is name of SQL Table's Id column
    protected Repository(DbContext context)
    {
        Context = context;
        DBSet = Context.Set<TEntity>();
    }
}

在这个类中,我们有一个名为SelectAll的方法如下:

[DataObjectMethod(DataObjectMethodType.Select, true)]
public IEnumerable<TEntity> SelectAll(IEnumerable<TIdentifier> ids, List<string> includeNavigationProperties = null)
{
    ParameterExpression parameter = Expression.Parameter(typeof(TEntity), "entity");
    MemberExpression leftParam = Expression.MakeMemberAccess(parameter, typeof(TEntity).GetProperty(IdentifierColumn));
    Expression body = parameter;
    foreach (TIdentifier identifier in ids)
    {
        var rightParam = Expression.Constant(identifier);
        body = Expression.Or(body, Expression.Equal(leftParam, rightParam));//Exception
    }
    return (IEnumerable<TEntity>) DBSet.Select(Expression.Lambda<Func<TEntity, bool>>(body, parameter));
}

如您所见,我想在IEnumerable<TIdentifier> ids中选择包含Id列的所有行。但是发生了以下异常:

  

二进制运算符Or未定义类型'DAL.Tag'和'System.Boolean'

1 个答案:

答案 0 :(得分:2)

如果你在纸上执行逻辑,你会得到像

这样的东西
  1. Expression = Entity
  2. Expression = Entity OR(parameter = ids [0])OR(parameter = ids [1])...
  3. 可能不是你的意思,除非实体恰好是一个布尔。