2

EFに取り組み、カスタムを書く必要があります

public virtual IEnumerable GetDataByID<TEntity>() where TEntity : class
{
    if (this.Context == null)
        Initialize<TEntity>();
    TContext context = this.Context;

    var result = context.CreateObjectSet<TEntity>().Where(GetExpression<TEntity>(5));
    return result;
}

public Expression GetExpression<TEntity>(int id) where TEntity : class
{
    ParameterExpression e = Expression.Parameter(typeof(TEntity), "e");
    PropertyInfo propInfo = typeof(TEntity).GetProperty(EntityInfo<TEntity>.GetPkFieldName(this.Context));//(KeyPropertyName);
    MemberExpression m = Expression.MakeMemberAccess(e, propInfo);
    ConstantExpression c = Expression.Constant(id, typeof(int));
    BinaryExpression b = Expression.Equal(m, c);
    Expression<Func<TEntity, bool>> lambda = Expression.Lambda<Func<TEntity, bool>>(b, e);
    return lambda;
}

エラー:

'System.Data.Objects.ObjectQuery.Where(string, params System.Data.Objects.ObjectParameter[])' に最適なオーバーロードされたメソッドの一致には、いくつかの無効な引数があります

上記の構文が機能しないのはなぜですか?どうすれば修正できますか?

4

2 に答える 2

1

'System.Data.Objects.ObjectQuery.Where(string、params System.Data.Objects.ObjectParameter [])'に最適なオーバーロードされたメソッドの一致には、いくつかの無効な引数があります

問題はこの行です:

var result = context.CreateObjectSet<TEntity>().Where(GetExpression<TEntity>(5));

実際、間違ったパラメーターを指定しています。ObjectQuery<T>.Where

public ObjectQuery<T> Where(
    string predicate,
    params ObjectParameter[] parameters
)

実際、文字列を渡す必要があります。

于 2012-12-24T11:56:19.320 に答える
1

問題は、コンパイラが使用しようとする独自のメソッドを定義する結果がCreateObjectSet<TEntity>返されることです。指定する引数はこのメソッドでは無効であるため、エラーが発生します。ObjectSet<TEntity>Where

使用したいのは、次のQueryable.WhereようなLinqの拡張メソッドです。

var predicate = GetExpression<TEntity>(5);
var objectSet = context.CreateObjectSet<TEntity>();
var results = System.Linq.Queryable.Where(objectSet, predicate);
于 2012-12-24T12:00:03.130 に答える