1

以下のようなジェネリックリポジトリクラスを作成しました:

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));
}

ご覧のとおり、でId列を持つすべての行を選択したいと思いますIEnumerable<TIdentifier> ids。ただし、次の例外が発生しました。

二項演算子Orは、タイプ'DAL.Tag'および'System.Boolean'には定義されていません

4

1 に答える 1

2

ロジックを紙で実行すると、次のようなものが得られます

  1. 式=エンティティ
  2. 式=エンティティOR(パラメータ= ids [0])OR(パラメータ= ids [1])..。

エンティティがブール値でない限り、おそらくあなたが意図したことではありません。

于 2013-02-20T21:34:29.930 に答える