首页 新闻 会员 周边

linq如何传group和select的lambda表达式?

0
悬赏园豆:50 [已关闭问题] 关闭于 2016-09-13 16:56


var
data = SalesDB.Sales.Where(t => t.ID == "4095").GroupBy(g => new { g.Name, g.Type }).Select(s => new SalesViewModel { Name = s.Key.Name, Type = s.Key.Type, Actual = s.Sum(g => g.Actual) })

实体类,

where的表达式 (t => t.ID == "4095")


,groupby的表达式(g => new { g.Name, g.Type })


,select的表达式(s => new SalesViewModel{Name = s.Key.Name,Type = s.Key.Type,Actual = s.Sum(g => g.Actual)})


 


需要从外部传进来,表达式的数量不定,应该怎么写?

 
复制代码
单传where的已经写出来了

public IQueryable<T> FindList(Expression<Func<T, bool>> where)
        {
            return DbContext.Set<T>().Where(where);
        }
复制代码
问题补充:

就是想用linq动态生成这样的sql语句

SELECT  
    [Name], 
    [Type] ,
    sum([Actual]) AS [Actual]
    FROM [dbo].[Sales]
    WHERE N'4095' = [ID]
    group by  
    [Name], 
    [Type]

也不知道我表达清楚没有。。。

moiam的主页 moiam | 初学一级 | 园豆:136
提问于:2016-09-08 16:37
< >
分享
所有回答(6)
0

你是想知道这个where怎么传入实参么?

顾晓北 | 园豆:10844 (专家六级) | 2016-09-08 17:15

已经知道where怎么传了,多个where用PredicateBuilder来组合的。

但是  groupby的表达式(g => new { g.Name, g.Type }) 不知道怎么传进去

同理sum的也不知道

支持(0) 反对(0) moiam | 园豆:136 (初学一级) | 2016-09-08 18:21

@moiam: Expression<Func<Sales, bool>> where= g=>g.ID=4095

类似这样

支持(0) 反对(0) 顾晓北 | 园豆:10844 (专家六级) | 2016-09-09 08:33
0

Select:

Expression<Func<TSource, TResult>> selector

GroupBy:

Expression<Func<TSource, TKey>> keySelector
dudu | 园豆:30994 (高人七级) | 2016-09-08 17:21

 Expression<Func<TSource, TKey>>接不了 new { g.Name, g.Type },有浪线。。

 

支持(0) 反对(0) moiam | 园豆:136 (初学一级) | 2016-09-08 18:22

@moiam: 我试了一下,这样是可以传过去的:

public class Item
{
    public string Name { get; set; }

    public string Type { get; set; }
}

public class Program
{
    public static void Main(string[] args)
    {
        var items = new List<Item>()
        {
            new Item { Name = "A", Type = "X"  },
            new Item { Name = "B", Type = "X"  }
        };

        Query<Item, dynamic>(items.AsQueryable(), x => new { x.Name, x.Type });                
    }
        
    private static IQueryable<IGrouping<TKey, TSource>> Query<TSource, TKey>(
        IQueryable<TSource> query, 
        Expression<Func<TSource, TKey>> keySelector)
    {
        return query.GroupBy(keySelector);
    }
}
支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2016-09-08 22:13

@dudu: 传进来以后怎么拼在我的查询linq里呢?

  public IQueryable<IGrouping<TKey, TSource>> LinqTable2<TSource, TKey>(Expression<Func<T, bool>> where, Expression<Func<TSource, TKey>> groupParam, int number)
        {
            return DbContext.Set<T>().Where(where).GroupBy(groupParam);
               
        }

这么写GroupBy会有浪线。。

能加个qq说吗?

支持(0) 反对(0) moiam | 园豆:136 (初学一级) | 2016-09-09 13:07

@moiam: 浪线(匿名类型)与这里的.GroupBy(groupParam)没关系,是LinqTable2()方法的调用方的事情。

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2016-09-09 13:31

@dudu: GroupBy可以传了,但是后面的

select(s => new SalesViewModel { Name = s.Key.Name, Type = s.Key.Type, Actual = s.Sum(g => g.Actual) })

 

还是不知道要怎么处理,能否在指点一下?

支持(0) 反对(0) moiam | 园豆:136 (初学一级) | 2016-09-11 19:20
0

引用 System.Linq.Dynamic  就行了啊

alci | 园豆:233 (菜鸟二级) | 2016-09-08 17:24

没了解过。。回头再看一下

支持(0) 反对(0) moiam | 园豆:136 (初学一级) | 2016-09-08 18:27
0

这三个Expression查询后返回的类型都是不一样的,你想做在一个方法里面估计是不行

balahoho | 园豆:2050 (老鸟四级) | 2016-09-08 18:05

是一个查询啊。你看我第一个例子。

支持(0) 反对(0) moiam | 园豆:136 (初学一级) | 2016-09-08 18:23

@moiam: 我知道是一个查询,你是想把where、groupby、select这些当作方法的可选参数,然后查询结果对吧?反正我试了一下并不行

支持(0) 反对(0) balahoho | 园豆:2050 (老鸟四级) | 2016-09-08 20:56
0

你想用一个参数接2个参数的东西.你再加个参数就好.实在想用1个参数就定一个查询对象类.

吴瑞祥 | 园豆:29449 (高人七级) | 2016-09-08 18:35
0

用if判断,发现有group条件,在拼接上去。

var q = xxx.Where();

if(groupBy)

{

    var g = q.GroupBy()

}

幻天芒 | 园豆:37175 (高人七级) | 2016-09-09 10:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册