- 浏览: 492174 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (329)
- [发布至博客园首页] (12)
- [随笔分类][01] .Net X (59)
- [随笔分类][20] Architecture (16)
- [随笔分类][21] Developer Logs (13)
- [网站分类]Windows 7 (1)
- [随笔分类][13] Oracle & .Net (7)
- [随笔分类][16] Love in China (14)
- [随笔分类][15] Development Tools (20)
- [随笔分类][18] Windows Phone (12)
- [随笔分类][12] Design & Pattern (17)
- [网站分类].NET新手区 (22)
- [网站分类]首页候选区 (2)
- [随笔分类][08] Windows (Server) (13)
- [随笔分类][02] CSLA.Net (3)
- [随笔分类][10] jQuery & javaScript (10)
- [随笔分类][11] SQL Server (4)
- [随笔分类][22] Enterprise Logs (3)
- [随笔分类][03] News (9)
- [随笔分类][19] Quality Assurance (2)
- [随笔分类][05] Silverlight (20)
- [随笔分类][14] Google Earth & .Net (6)
- [网站分类]非技术区 (9)
- [随笔分类][07] WWF (2)
- [随笔分类][04] SharePoint (1)
- [随笔分类][20] Analysis & Design (36)
- [随笔分类][06] WCF (5)
- [随笔分类][12] Architecture (1)
- [随笔分类][09] WPF (0)
- [随笔分类][17] VStudio & Expression (5)
最新评论
-
zhangyy130:
你好,我关于第二段的那个表视图、模型与图这三者的关系我没有看明 ...
UML模型的组成 -
guji528:
谢谢分享!
Enterprise Architect 基础应用 -
studentsky:
好文章,图文并茂!
WCF 第一个用 Visual Studio 2010 创建的WCF服务 -
chen975311486:
用哪个工具画的????
UML中对关系的描述 (二) -
frankies:
继续学习中。。
UML 交互概述图
在 LINQ to Objects 中,扩展方法需要将一个委托类型作为参数,这样就可以将λ表达式赋予参数。
λ达式也可以赋予Expression<T>类型的参数。Expression<T>类型指定,来自于λ表达式的表达式树存储在程序集中。
这样,就可以在运行期间分析表达式,并进行优化,以便于查询数据源。
下面看看一个前面使用的查询表达式:
var brazilRacers = from r in racers
where r.Country == "Brazil"
orderby r.Wins
select r;
这个查询表达式使用了扩展方法Where、OrderBy 和Select。
Enumerable 类定义了Where 扩展方法,并将委托类型Func<T,bool>作为参数谓词。
public static IEnumerable<T> Where<T> (this IEnumerable<T> source, Func<T,bool> predicate);
这样,就把λ表达式赋予谓词。这里λ 表达式类似于前面介绍的匿名方法。
Func<T, bool> predicate = r.Country == "Brazil";
Enumerable 类不是唯一定义了扩展方法Where 的类。
Queryable<T>类也定义了Where扩展方法。
这个类对Where 扩展方法的定义是不同的:
public static IQueryable<T> Where<T> (this IQueryable<T> source,
Expression<Func<T,bool>> predicate);
其中,λ 表达式赋予类型Expression<T>,它的操作是不同的:
Expression<Func<T, bool>> predicate = r.Country == "Brazil";
除了使用委托之外,编译器还会把表达式树放在程序集中。表达式树可以在运行期间读取。
表达式树从派生自抽象基类Expression 的类中建立。
Expression 类与Expression<T>不同。
继承了Expression 的表达式类有BinaryExpression、ConstantExpression、InvocationExpression、LambdaExpression 、
NewExpression 、NewArrayExpression 、TernaryExpression 、UnaryExpression 等。编译器会从λ 表达式中创建表达式树。
例如,λ表达式r.Country==“Brazil”使用了ParameterExpression、MemberExpression、ConstantExpression
和MethodCallExpression,来创建一个表达式树,将该树存储在程序集中。之后在运行期间使用这个树,创建一个用于底层数据源的优化查询。
方法 DisplayTree()在控制台上图形化地显示表达式树。其中传送了一个Expression 对象,并根据表达式
类型,把表达式的一些信息写到控制台上。根据表达式的类型,递归调用方法DisplayTree()。
提示:在这个方法中,没有处理所有的表达式类型,只处理了下列示例表达式中使用的类型:
private static void DisplayTree(int indent, string message, Expression expression) { string output = String.Format("{0} {1}! NodeType: {2}; Expr: {3} ", "".PadLeft(indent, '>'), message, expression.NodeType, expression); indent++; switch (expression.NodeType) { case ExpressionType.Lambda: Console.WriteLine(output); LambdaExpression lambdaExpr = (LambdaExpression)expression; foreach (var parameter in lambdaExpr.Parameters) { DisplayTree(indent, "Parameter", parameter); } DisplayTree(indent, "Body", lambdaExpr.Body); break; case ExpressionType.Constant: ConstantExpression constExpr = (ConstantExpression)expression; Console.WriteLine("{0} Const Value: {1}", output, constExpr.Value); break; case ExpressionType.Parameter: ParameterExpression paramExpr = (ParameterExpression)expression; Console.WriteLine("{0} Param Type: {1}", output, paramExpr.Type.Name); break; case ExpressionType.Equal: case ExpressionType.AndAlso: case ExpressionType.GreaterThan: BinaryExpression binExpr = (BinaryExpression)expression; if (binExpr.Method != null) Console.WriteLine("{0} Method: {1}", output, binExpr.Method.Name); else Console.WriteLine(output); DisplayTree(indent, "Left", binExpr.Left); DisplayTree(indent, "Right", binExpr.Right); break; case ExpressionType.MemberAccess: MemberExpression memberExpr = (MemberExpression)expression; Console.WriteLine("{0} Member Name: {1}, Type: {2}", output, memberExpr.Member.Name, memberExpr.Type.Name); DisplayTree(indent, "Member Expr", memberExpr.Expression); break; default: Console.WriteLine(); Console.WriteLine("....{0} {1}", expression.NodeType, expression.Type.Name); break; } }
前面已经介绍了用于显示表达式树的表达式。
这是一个λ表达式,它使用一个Racer 参数,表达式体提取赢得比赛次数超过6 次的巴西赛手:
private static void Expressions() { Expression<Func<Racer, bool>> expression = r => r.Country == "Brazil" && r.Wins > 6; DisplayTree(0, "Lambda", expression); }
下面看看结果。λ表达式包含一个Parameter 和一个AndAlso 节点类型。
AndAlso 节点类型的左边是一个Equal 节点类型,
右边是一个GreaterThan 节点类型。
Equal 节点类型的左边是MemberAccess 节点类型,
右边是Constant 节点类型。
使用类型Expression<T>的一个例子是LINQ to SQL。
LINQ to SQL 用Expression<T>参数定义了扩展方法。
这样,访问数据库的LINQ 提供程序就可以读取表达式,创建一个运行期间优化的查询,从数据库中获取数
据。
发表评论
-
LINQ to SQL语句之Insert/Update/Delete操作
2009-12-30 14:54 1107Insert/Update/Delete操作 插入(Ins ... -
RabbitMQ 安装配置和简单实例
2010-01-21 16:52 1824安装ErLang运行环境 配置运行环境变量 启动服务 ... -
MSMQ(Microsoft Message Queue,微软消息队列) Asp.Net 简单示例
2010-01-22 14:59 3253系统: Windows XP 1.安装MSMQ 控制面板—&g ... -
IromPython .Net 的简介和第一个例子
2010-01-23 18:53 1341.Net 4 都已经到来 ... -
Microsoft Asp.Net MVC 从入门到精通
2010-01-27 17:53 835ASP.NET MVC Framework是微软官方提供的MV ... -
C# Socket 同步通信与异步通信 示例
2010-01-30 17:50 4734同步 1.建立链接发送和获取信息 异步 1.服务器端建立一 ... -
解决 Visual Stuido 工具栏中的工具重置后,恢复回来。
2009-12-18 17:06 1245拿DevExpress 控件为例,如果重置工具栏后,以前的工具 ... -
LINQ to SQL 用O/R设计器手工建表对象
2009-10-11 22:04 1016除了自己建立定制对象外,还可以使用O/R设计器以可视化的方式创 ... -
LINQ to XML .Net 3.5 中的新XML对象
2009-10-15 14:11 885System.Xml.Linq 命名空间中,有一系列新的LIN ... -
LINQ to XML 用 LINQ 查询 XML
2009-10-15 15:57 670将一个已知的XML放到XDocument 对象当中使用LINQ ... -
LINQ to XML 操作XML文档
2009-10-15 17:18 973使用 XDocument 对象的 Element 方法,获取制 ... -
C# 编码规范
2009-10-15 19:20 722陈年的文档,不过很不错整理出来发到博客上,还有更多的朋友需要。 ... -
Visual Studio 项目模板、文件模板、代码段和环境设置
2009-10-15 19:31 934很久前使用过,那个时候还没有开始写博客,好久不用就都忘记了,这 ... -
ADO.NET Entity Framework 概述
2009-10-16 11:50 563ADO.NET Entity Framework 与 LINQ ... -
LinqPad 1.31 下载
2009-01-14 15:42 965LinqPad 1.31 也许你已经非常熟悉他了,为即将使用L ... -
jQuery 的第一个例子
2009-01-18 10:34 789通过这个例子可以对jQuery的使用有个基本的认识,jQ ... -
jQuery 选择器的使用
2009-01-18 10:39 831jQuery 能如此的流行,很重要的一点也许就是他有非常强大且 ... -
一次从GridView 获得多个指定行中多个指定控件的值
2009-01-20 07:33 868一次从GridView 获得多个指定行中多个指定控件的值,非常 ... -
jQuery 的Ajax应用(1)--学习篇,内附实例
2009-01-28 21:48 1324下面以前台jQuery,后天C# 的方式,演示了,如何通过 ... -
Enterprise Library 4.1 一步一步从入门到精通(未完成)
2009-02-05 23:04 886Enterprise Library 4.1 一步一步从入门到 ...
相关推荐
NULL 博文链接:https://rednaxelafx.iteye.com/blog/247270
Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达式树 调试 简介 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法...
using System.Linq.Expressions; class DynamicPredicate { public static Expression<Func>> Generate(string op) { ParameterExpression x = Expression.Parameter(typeof(T), "x"); ParameterExpression y = ...
代码如下: 代码如下: using System.Linq.Expressions; public static class PredicateExtensionses { public static Expression<Func>> True() { return f => true; } public static Expression<Func>> Fa
介绍了System.Linq.Expression命名空间下的Expression类以及如何执行和修改表达式树,最后介绍了表达式树用到的访问者模式。
远程Linq 分支AppVeyor 特拉维斯CI 代码库编纂CodeFactor 执照main 包裹努吉特我的Remote.Linq Remote.Linq.Async.Queryable Remote.Linq.EntityFramework Remote.Linq.... 特征将LINQ表达式转换为可序列化的表达式树
蜡Wax 源于我对 Linq-to-SQL 无法处理InvocationExpression的挫败感,因此它的主要目的是允许保存和重用常用表达式,而不是每次都逐字重复。 Wax 还包含一些我发现在处理表达式时很有用的其他函数。 using System ;...
为您的.NET表达式树榨汁,获取它们所拥有的一切! 。 。代码重用:在其他较大的表达式中调用(即嵌入)表达式。 有没有想过您是否可以避免在为Entity Framework或LINQ-2-SQL编写LINQ表达式时一遍又一遍地键入完全...
工具 包含一些常用的操作类,大都是静态类,加密解密,反射操作,动态编译,权重随机筛选算法,简繁转换,分布式短ID,表达式树,linq扩展,文件压缩,多线程下载和FTP客户端,硬件信息,串行扩展方法,日期时间扩展...
.NET 3.5的新特性包括: 自动属性(Auto-Implemented Properties) ...Lambda表达式和Lambda表达式树 (Lambda Expression and Lambda Expression Trees) LINQ,语言级集成查询(Language INtegrated Query)
动态快车 可用平台:.NET Core 2.0、.NET 4.5、.NET ... 它不会生成程序集,但会动态创建表达式树。 例如,您可以计算数学表达式: var interpreter = new Interpreter ();var result = interpreter . Eval ( " 8 / 2
我们知道C#是非常先进的语言,因为是它很有远见的“语法糖”。这些“语法糖”有时过于好用,导致有人觉得它是C#编译器写死的东西,没有道理可讲的——有点像“黑... 表达式树,与Expression类型; 插值字符串,与Forma
8.1.4 LINQ 数据源控件(LinqDataSource) 8.1.5 Xml 数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) 8.2 重复列表控件(Repeater) 8.3 数据列表控件(DataList) 8.4 数据列表控件...
8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) 8.2 重复列表控件(Repeater) 8.3 数据列表控件(DataList) 8.4 数据列表控件(GridView...
8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) 8.2 重复列表控件(Repeater) 8.3 数据列表控件(DataList) 8.4 数据列表控件(GridView...
8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) 8.2 重复列表控件(Repeater) 8.3 数据列表控件(DataList) 8.4 数据列表控件(GridView...
8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) 8.2 重复列表控件(Repeater) 8.3 数据列表控件(DataList) 8.4 数据列表控件(GridView...
8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) 8.2 重复列表控件(Repeater) 8.3 数据列表控件(DataList) 8.4 数据列表控件(GridView...
20.3.1 linq to objects与linq to sql741 20.3.2 使用linq to sql进行选择742 20.3.3 使用linq to sql进行插入748 20.3.4 使用linq to sql进行更新751 20.3.5 使用linq to sql进行删除754 20.3.6 动态查询755 20.3.7...
这会将OData查询转换为表达式树,并将其传递给ORM框架。 支持的ORM:实体框架6,实体框架核心,Linq2Db public sealed class OrderContext : DbContext{ public DbSet < Customer> Customers { get ; set ; } ...