2014-02-20 43 views
1

我想寫這個groupQuery與FirstOrDefault創建選擇動態LINQ表達式:

IQueryable<IGrouping<TKey, TEntity>> groupQuery; 
... 
IQueryable<TEntity> query2 = groupQuery.Select(x => x.FirstOrDefault()); 

的動態表達:

ParameterExpression param = Expression.Parameter(typeof(TEntity), "x"); 

IQueryable<TEntity> query2 = groupQuery.Provider.CreateQuery(
    Expression.Call(
     typeof(Queryable), 
     "Select", 
     new Type[] { typeof(TEntity), typeof(TKey)}, 
     groupQuery.Expression, 
     Expression.Lambda(firstOrDefaultExpression, param))); 

如何寫firstOrDefaultExpression以及如何完成這個動態表達式與groupQuery.Select(x => x.FirstOrDefault())相同的結果?

回答

1

應該這樣做:

public IQueryable<TEntity> SelectFirst<TEntity,TKey>(IQueryable<IGrouping<TKey, TEntity>> groupQuery) 
    { 
     ParameterExpression param = Expression.Parameter(groupQuery.ElementType, "x"); 
     var lambda = Expression.Lambda<Func<IGrouping<TKey, TEntity>,TEntity>>(
      Expression.Call(typeof(Enumerable),"FirstOrDefault",new []{typeof(TEntity)},param), 
      param); 

     var select = Expression.Call(
      typeof(Queryable), 
      "Select", 
      new []{groupQuery.ElementType,typeof(TEntity)}, 
      groupQuery.Expression,lambda); 
     return groupQuery.Provider.CreateQuery<TEntity>(select); 
    } 

然後你調用爲:

SelectFirst(list.GroupBy(x=>[...]).AsQueryable()); 
+0

感謝。適用於一些修改。 – Cyrus