【问题标题】:Create dynamic LINQ expression for Select with FirstOrDefault inside使用 FirstOrDefault 为 Select 创建动态 LINQ 表达式
【发布时间】:2014-02-20 23:44:35
【问题描述】:

我正在尝试编写这个 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 =&gt; x.FirstOrDefault()) 相同的结果?

【问题讨论】:

    标签: c# .net linq entity-framework


    【解决方案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());
    

    【讨论】:

    • 谢谢。可以进行一些修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 2014-07-06
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多