2012-12-24 43 views
2

工作的EF,需要編寫一個自定義的,其中爲什麼表情不是LINQ工作

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

錯誤:

The best overloaded method match for 'System.Data.Objects.ObjectQuery.Where(string, params System.Data.Objects.ObjectParameter[])' has some invalid arguments

爲什麼我上面的語法不工作,如何解決呢?

+6

有什麼錯誤訊息? –

回答

1

The best overloaded method match for 'System.Data.Objects.ObjectQuery.Where(string, params System.Data.Objects.ObjectParameter[])' has some invalid arguments

的問題是這一行:

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

逸岸你specifing了錯誤的參數:ObjectQuery<T>.Where

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

逸岸你應該傳遞一個字符串。

+0

我在編輯之前點擊以downvote,在那裏您將實體與表達式進行比較。 SO似乎註冊了編輯後發生的downvote(輕微故障?),所以我目前無法刪除它。如果你做一個小編輯,我會刪除downvote,因爲我現在看到答案沒有錯:) – Lukazoid

+0

+1積極編輯並突出顯示問題在手:) – Lukazoid

1

問題是,CreateObjectSet<TEntity>的結果返回ObjectSet<TEntity>,它定義了編譯器將嘗試使用的自己的Where方法。您提供的參數對此方法無效,因此錯誤。

要使用什麼樣子的LINQ的Queryable.Where擴展方法,以便:

var predicate = GetExpression<TEntity>(5); 
var objectSet = context.CreateObjectSet<TEntity>(); 
var results = System.Linq.Queryable.Where(objectSet, predicate);