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]
也不知道我表达清楚没有。。。
你是想知道这个where怎么传入实参么?
已经知道where怎么传了,多个where用PredicateBuilder来组合的。
但是 groupby的表达式(g => new { g.Name, g.Type }) 不知道怎么传进去
同理sum的也不知道
@moiam: Expression<Func<Sales, bool>> where= g=>g.ID=4095
类似这样
Select:
Expression<Func<TSource, TResult>> selector
GroupBy:
Expression<Func<TSource, TKey>> keySelector
Expression<Func<TSource, TKey>>接不了 new { g.Name, g.Type },有浪线。。
@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);
}
}
@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说吗?
@moiam: 浪线(匿名类型)与这里的.GroupBy(groupParam)没关系,是LinqTable2()方法的调用方的事情。
@dudu: GroupBy可以传了,但是后面的
select(s => new SalesViewModel { Name = s.Key.Name, Type = s.Key.Type, Actual = s.Sum(g => g.Actual) })
还是不知道要怎么处理,能否在指点一下?
引用 System.Linq.Dynamic 就行了啊
没了解过。。回头再看一下
这三个Expression查询后返回的类型都是不一样的,你想做在一个方法里面估计是不行
是一个查询啊。你看我第一个例子。
@moiam: 我知道是一个查询,你是想把where、groupby、select这些当作方法的可选参数,然后查询结果对吧?反正我试了一下并不行
你想用一个参数接2个参数的东西.你再加个参数就好.实在想用1个参数就定一个查询对象类.
用if判断,发现有group条件,在拼接上去。
var q = xxx.Where();
if(groupBy)
{
var g = q.GroupBy()
}