说起匿名类型,我们都知道这玩意都是为linq而生,而且匿名类型给我们带来的便利性大家在实战中应该都体会到了,特别适合于一次性使用,临时

使用这些场景,虽然说是匿名类型,也就是说是有类型的,只是匿名了而已,对吧,这篇我们就来探索下匿名类型到底和linq有多大关系呢???

一:select中的匿名类型

  这个我想大家用的是最多的,毕竟你select之后需要把原始数据重塑成另一种形状展示出来,不信你看嘛!!!

     class Program
{
static void Main(string[] args)
{
var strs = new string[] { "as", "is", "two", "spa" }; var query = from str in strs
let temp = str.ToUpper()
where temp.Contains("S")
select new { Word = temp, Length = temp.Length };
}
}

从上面的代码中,你可以看到,原来只是一个string数组,经过linq整合之后就成了一个IEnumerable集合的匿名类集合,并且成功的把每个字符串大写化

并且统计每个字符串的长度,也体现了匿名类型的临时性。

二:JavaScriptSerializer 中的匿名类型

这个类型我想大家都清楚,不过性能更高的方式应该是用JsonConvert吧,但这个不是本篇讨论的话题,我们重点来看看匿名类型的Json序列化能给我们

带来多大的便利性,比如下面这样:

     class Program
{
static void Main(string[] args)
{
JavaScriptSerializer serializer = new JavaScriptSerializer(); var json = serializer.Serialize(new { Message = "ok", Code = });
}
}

从上图中可以看到,其实我并没有显式的定义一个model,而是定义了一个匿名的model,这个model具有Message和Code字段,这样我们就可以直接序

列化了,是不是很方便呢??

三:linq中的多键关联

  当我们用linq做两个集合的关联时,会用到on...equals...或者就是两个from...from....where 解决,而且通常情况下只有一个键的关联,比如下面这样:

     class Program
{
static void Main(string[] args)
{
var productList = new List<Product>()
{
new Product() { ProductID=, ProductName="传奇少女2016春秋新款韩版宽松衬衫连衣裙棉麻质感防晒外套风衣女", SupplierID= },
new Product() { ProductID=, ProductName="衬衫女长袖2016春装新款女装韩范春夏上衣衬衣春季百搭长袖打底衫", SupplierID= },
new Product() { ProductID=, ProductName="雪纺衬衫女长袖棉立方2016初春新品女装上衣手风琴褶雪纺衫衬衣", SupplierID= },
}; var orderList = new List<Order>
{
new Order() { OrderID=, OrderName="第一个订单", ProductID=, SupplierID= },
new Order() { OrderID=, OrderName="第二个订单", ProductID=, SupplierID= },
new Order() { OrderID=, OrderName="第三个订单", ProductID=, SupplierID= }
}; var query = from p in productList
join o in orderList
on p.ProductID equals o.ProductID
select new
{
ProductID = p.ProductID,
ProductName = p.ProductID,
OrderID = o.OrderID,
OrderName = o.OrderName,
SupplierID = p.SupplierID
};
}
}

由于数据是伪造的,所以就不考虑逻辑性,而是专注于linq语法层次,好了,上面这样的linq,我们看看最后的结果会是怎么样的。

可以看到我们从数据库中读取到了三条数据,而且这时候我们equal中的条件是on p.ProductID equals o.ProductID,现在需求扑面而来了,如果我

不仅要判断ProductID,还要判断SupplierID也要相等,这样的需求特么的怎么搞呢??? 那就看看我是怎么搞的哈!!!

  var query = from p in productList
join o in orderList
on new { ProductID = p.ProductID, SupplierID = p.SupplierID } equals new { ProductID = o.ProductID, SupplierID = o.SupplierID }
select new
{
ProductID = p.ProductID,
ProductName = p.ProductID,
OrderID = o.OrderID,
OrderName = o.OrderName,
SupplierID = p.SupplierID
};

看到没有,标成红色的就是代码的核心,正好我们利用到了匿名类型的equals重写方法,就是因为这个重写解决了多条件的问题,是不是很强大,下面

再简单看看匿名类型的equals是怎么被重写的。

从图中可以看到,匿名类型就是追个字段的equals方法比较是否相等的,好了,到现在为止你应该明白了匿名类型对于linq来说是多么的重要啦~~~

Linq专题之提高编码效率—— 第二篇 神一样的匿名类型的更多相关文章

  1. Linq专题之提高编码效率—— 第一篇 Aggregate方法

    我们知道linq是一个很古老的东西,大家也知道,自从用了linq,我们的foreach少了很多,但有一个现实就是我们在实际应用中使用到的却是屈指可数 的几个方法,这个系列我会带领大家看遍linq,好的 ...

  2. Linq专题之提高编码效率—— 第三篇 你需要知道的枚举类

     众所周知,如果一个类可以被枚举,那么这个类必须要实现IEnumerable接口,而恰恰我们所有的linq都是一个继承自IEnumerable接口的匿名类, 那么问题就来了,IEnumerable使了 ...

  3. Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

    上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用 首先来看一下C++中的sayHello方法的实现: JNIEXPO ...

  4. 第二篇 python进阶

    目录 第二篇 python进阶 一 数字类型内置方法 二 字符串类型内置方法 三 列表类型内置方法(list) 四 元组类型内置方法(tuple) 五 字典内置方法 六 集合类型内置方法(self) ...

  5. 解剖SQLSERVER 第二篇 对数据页面头进行逆向(译)

    解剖SQLSERVER 第二篇  对数据页面头进行逆向(译) http://improve.dk/reverse-engineering-sql-server-page-headers/ 在开发Orc ...

  6. 第二篇 Replication:分发服务器的作用

    本篇文章是SQL Server Replication系列的第二篇,详细内容请参考原文. 分发服务器是SQL Server复制的核心组件.分发服务器控制并执行数据从一个服务器移动到另一个服务器的进程. ...

  7. 第二篇 SQL Server代理作业步骤和子系统

    本篇文章是SQL Server代理系列的第二篇,详细内容请参考原文. SQL Server代理作业由一系列的一个或多个作业步骤组成.一个作业步骤分配给一个特定的作业子系统(确定作业步骤去完成的工作). ...

  8. [老老实实学WCF] 第二篇 配置WCF

    老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...

  9. PHP 性能分析第二篇: Xhgui In-Depth

    [前言]这是国外知名博主 Davey Shafik 撰写的 PHP 应用性能分析系列的第二篇,第一篇介绍 Xhprof/Xhgui,第三篇则关注于性能调优实践. 在第一篇中,我们初步介绍了 xhpro ...

随机推荐

  1. swift 中单例的写法

    在swift中单例的写法和oc的有所不同,在书写的时候又分很多种写法,,如果一个.swift 文件只创建了一个类,可以用那种dispatch_once的写法,如果一个.swift文件中有很多类的存在, ...

  2. ZOJ Problem Set - 1392 The Hardest Problem Ever

    放了一个长长的暑假,可能是这辈子最后一个这么长的暑假了吧,呵呵...今天来实验室了,先找了zoj上面简单的题目练练手直接贴代码了,不解释,就是一道简单的密文转换问题: #include <std ...

  3. hibernate笔记--单向多对一映射方法

    假设我们要建两张表,学生信息表(student)和年级信息表(grade),关系是这样的: 我们可以看出学生表和=年级表是多对一的关系,多个学生会隶属于一个班级,这种关系在hibernate中成为单边 ...

  4. ASP.NET系统国际化总结

    引言 系统要求同时支持中英文,以前对国际化这块只是听说过,从来没有自己动手过,提到国际化那么首先肯定想到的就是资源文件,也确实是这样,于是乎我从开始着手系统国际化功能时前前后后共投入了4次时间段,每次 ...

  5. ThinkPHP学习(一)

    下载3.2框架后,解压缩到web目录下面,可以看到初始的目录结构如下: 3.2版本相比之前的版本自带了一个完整的应用目录结构和默认的应用入口文件,开发人员可以在这个基 础之上灵活调整.其中, Appl ...

  6. “SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。”

    原因: .NET中  DateTime最小值为: 0001-1-1 0:00:00 数据库中DateTime最小值为: 1753-1-1 0:00:00, 很明显:.NET中的最小值超出了数据库时间类 ...

  7. 以太坊智能合约Hello World示例程序

    简介 以太坊(Ethereum)是一提供个智能合约(smart contract)功能的公共区块链(BlockChain)平台. 本文介绍了一个简单的以太坊智能合约的开发过程. 开发环境 在以太坊上开 ...

  8. 说说&和&&的区别

    &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true 时,整个运算结果才为true,否则,只要有一方为false,则结果为false. ...

  9. Spring工作原理

    一. IoC(Inversion of control): 控制反转1.IoC:概念:控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系核心:bean工厂:在Sprin ...

  10. Java02

    一.IDE的概念.eclipse的介绍.安装.使用 (用eclipse写HelloWorld例子)     1.什么是IDE(Integrated Development Environment)? ...