繁体   English   中英

在内部使用FirstOrDefault为Select创建动态LINQ表达式

[英]Create dynamic LINQ expression for Select with FirstOrDefault inside

我正在尝试编写此groupQuery:

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())相同结果的动态表达式?

应该这样做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM