var newExpression = resultSelector.Body as NewExpression;//转换为匿名对象表达式
来源:互联网 发布:mac mini 加内存 编辑:程序博客网 时间:2024/06/05 04:45
(获取软件加QQ:1458910822)
目的:以编程方式实现group查询,在开发ORM时,需要达到这样的效果
先看一个简单的group语句
select BarCode,ProductName,COUNT(BarCode) as total from ProductData group by BarCode,ProductName
order by COUNT(BarCode) desc
结果
1
2
3
4
BarCode ProductName total
------------------------------ ------------------------------ -----------
1212122 product2 4
21312313 product3 2
group语法分解为
查询哪些字段 BarCode,ProductName,COUNT(BarCode) as total
按哪些字段进行分组 group by BarCode,ProductName
按什么排序 order by COUNT(BarCode) desc
linq to sql 表示为
1
2
3
4
from p in ProductData
group p.BarCode by p.ProductName into g
select new
{
1
g.BarCode,
g.ProductName,
total=g.Count()
1
}
linq to sql很容易表达,用lambda该如何表达呢
跟普通SQL查询不同,查询字段和排序可用聚合函数count,sum,抛开这,用lambda,同样的查询可表示为
这里用匿名对象来作选择器
设定 query=new LambdaQuery
1
2
3
4
5
query.Select(b=>new{b.BarCode,b.ProductName})
.GroupBy(b=>new{b.BarCode,b.ProductName})
.OrderBy(b=>b.BarCode,true);
query.Select(b=>new{b.BarCode,b.ProductName}) 能表示 select BarCode,ProductName
但匿名对象可没Count(b.ProductName)这样的语法,所以没法生成select count(BarCode)这样的语法
没有直接的方法,但是有间接的方法,扩展方法 扩展方法真是个好东西,解决了很多问题
定义一个扩展方法,名称定义为大写,为避免冲突
1
2
3
4
public static int COUNT(this object origin)
{
return 0;
}
所有object对象将会有COUNT()方法
将上面语法进行改进为
1
query.Select(b=>new{b.BarCode,b.ProductName,total=b.BarCode.COUNT()})
以这样形式进行表示,这样在语法上是编译通过的,并且lambda支持这样的解析
完整表示改为
1
2
3
4
5
query.Select(b=>new{b.BarCode,b.ProductName,total=b.BarCode.COUNT()})
.GroupBy(b=>new{b.BarCode,b.ProductName})
.OrderBy(b=>b.BarCode.COUNT(),true);
这样,完整的group表示语法就完成了,致少在逻辑上,是能实现SQL的group语法了,剩下就需要进行解析了
定义参数
1
2
3
public List
public List
public List
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//此方法解析方法调用表达式的属性名和方法名
string GetPropertyMethod(Expression item,out string methodName)
{ //转换为方法表达式
var method = item as MethodCallExpression;
MemberExpression memberExpression; //获取访问属性表达式
if (method.Arguments[0] is UnaryExpression)
{
memberExpression = (method.Arguments[0] as UnaryExpression).Operand as MemberExpression;
}
else
{
memberExpression = method.Arguments[0] as MemberExpression;
}
methodName = method.Method.Name;//调用的方法名
return memberExpression.Member.Name;//返回访问的属性名
}
解析Select
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public LambdaQuery
{
string queryFullName = "";
var newExpression = resultSelector.Body as NewExpression;//转换为匿名对象表达式
int i = 0;
foreach (var item in newExpression.Arguments)//遍历所有参数
{
var memberName = newExpression.Members[i].Name;//获取构造的属性名
if (item is MethodCallExpression)//如果是方法
{
string methodName;
string propertyName = GetPropertyMethod(item, out methodName);//获取方法名和属性名
queryFullName = string.Format("{0}({1}) as {2}", methodName, propertyName, memberName);
}
else//直接属性
0 0
- var newExpression = resultSelector.Body as NewExpression;//转换为匿名对象表达式
- var newExpression = resultSelector.Body as NewExpression;//转换为匿名对象表达式
- var newExpression = resultSelector.Body as NewExpression;//转换为匿名对象表达式
- C#中的Lambda 表达式 => 和匿名表达式 var
- C# 匿名对象(匿名类型)、var、动态类型 dynamic
- C# 匿名对象(匿名类型)、var、动态类型 dynamic
- document.body为空或不是对象
- linq 匿名对象(var) 转 List<T>
- 隐含类型var 转换为 DataTable
- 关于var body=document.getElementsByTagName("body")[0];出现的问题
- Swift_符号表达式(【Int? = optional Int】、【as\as!\as?】、nil 代表值为nil非空、?可以选链..... )
- 转换为表达式
- 字符串转换为表达式
- body 对象
- body对象
- body对象
- 匿名对象和object的转换
- 匿名对象和object的转换
- Javascript的"预编译"思考
- 8种常用json解析示例(原创作者:smallbee 本文转载于:http://smallbee.iteye.com/)
- c语言中的static变量和static函数
- <br>int rightFind(LIST_T *list, int row, int col, int isCircle, int *outRow, int *outCol)
- 黑马程序员——JAVA集合框架(二)
- var newExpression = resultSelector.Body as NewExpression;//转换为匿名对象表达式
- javascript基础知识归纳总结
- <br>int rightFind(LIST_T *list, int row, int col, int isCircle, int *outRow, int *outCol)
- var newExpression = resultSelector.Body as NewExpression;//转换为匿名对象表达式
- var newExpression = resultSelector.Body as NewExpression;//转换为匿名对象表达式
- RSA算法原理(一)
- Lock
- Android操作HTTP实现与服务器通信(基础)
- shell中获取android源码编译输出目录