关注灾区, 我们的心在一起!
LINQ to XML
.NET Framework提供了大量的API用于处理XML数据. 从Framework 3.5开始, 对于处理常规XML文档的第一选择将是LINQ to XML. LINQ to XML包含一个轻量级的LINQ友好的XML文档对象模型, 以及一系列附加的查询操作符. 在多数场景中, 它可以被当中是先前的W3C兼容的DOM模型的替换(即XmlDocument). LINQ to XML DOM设计极其优良并且可以高效执行. 即使没有LINQ, LINQ to XML DOM作为对低级XmlReader和XmlWriter的门面(Facade)包装也是非常有价值的.
所有的LINQ to XML类型都定义在System.Xml.Linq命名空间下.
架构概貌
考虑以下的XML文件
1: <?xml version="1.0" encoding="utf-8" standalone="yes"?>
2: <customer id="123" status="archived">
3: <firstname>Joe</firstname>
4: <lastname>Bloggs</lastname>
5: </customer>
对于所有的XML文件, 我们首先定义一个声明, 然后定义一个root元素, 它的名称是customer. customer元素包含有两个属性, 并各自有名称(id和status)以及对应值("123"和"archived"). customer还拥有两个子元素, firstName和lastName, 它们还包含了各自的简单文本内容("Joe"和"Bloggs").
所有的这些构件–声明,元素,属性,值以及文本内容, 都可以用一个类来展现. 如果这样的一个类型拥有集合属性来存储子内容的话, 我们可以聚合一棵对象树来描述一个文档. 这被称为文档对象模型, 即DOM.
LINQ to XML包含两个内容:
正如你可能期待的那样, X-DOM的组成类型包括像XDocument, XElement以及XAttribute. 有趣的是, X-DOM的类型并不依赖于LINQ–在没有编写任何LINQ查询的情况下你依然可以加载, 实例化, 更新以及保存一个X-DOM.
相反的, 你能够使用LINQ去查询一个DOM并创建一个老式的W3C兼容的类型. 然而, 过程可能会令人沮丧并且会有一定的限制. 一个区别(与W3C DOM比)的特征是XDOM是LINQ友好的, 这意味着:
待续!
创建方法
| 方法 | 描述 |
| Empty | 创建一个空序列 |
| Repeat | 创建一个包含重复元素的序列 |
| Range | 创建一个包含整数的序列 |
Empty, Repeat和Range都是静态方法, 用于加工简单的本地序列
Empty
Empty制造一个空序列并且只需要一个类型参数:
1: foreach (string s in Enumerable.Empty<string>())
2: Console.Write(s); // <nothing>
与??操作符联合, Empty可以完成和DefaultIfEmpty相反的工作. 例如, 假设我们有一个锯齿形状的整型数组, 并且我们希望能够将所有的整数放入到一个扁平的列表当中. 以下的SelectMany将会失败因为输入序列包含了null的内部数组:
1: int[][] numbers =
2: {
3: new int[] { 1, 2, 3 },
4: new int[] { 4, 5, 6 },
5: null // null会导致查询失败.
6: };
7:
8: IEnumerable<int> flat =
9: numbers.SelectMany (innerArray =>innerArray);
Empty联合??操作符可以修正此问题:
1: IEnumerable<int> flat = numbers
2: .SelectMany (innerArray =>
3: innerArray ?? Enumerable.Empty <int>() );
4:
5: foreach (int i in flat)
6: Console.Write (i + " "); // 1 2 3 4 5 6
Range和Repeat
Range和Repeat只能与整数一起工作. Range接受一个起始索引和取值总数:
1: foreach (int i in Enumerable.Range (5,5))
2: Console.Write (i + " "); // 5 6 7 8 9
Repeat接受一个接受重复的数字以及要重复的次数的参数:
1: foreach (int i in Enumerable.Repeat (5,3))
2: Console.Write (i + " "); // 5 5 5
待续!
试试看效果如何!~ 貌似效果还不错, 可惜不知道为什么, Writer的plug-in网站我一直没有办法访问, 需要弄一个能够方便编辑代码的插件才行!
1: public static void AddNew(ClaimRequestCommon.Model.ClaimRequest cr)
2: {
3: using (ClaimRequestDataContext dc = new ClaimRequestDataContext())
4: {
5: dc.ClaimRequests.InsertOnSubmit(cr);
6: dc.SubmitChanges();
7: }
8: }
终于载到了, 效果的确是不错, 以后就用它了.!~
量词
Contains: 如果输入序列包含给定元素则返回true, 对应SQL语法为WHERE…IN
Any: 如果有任何的元素满足给定的断言判定则返回true, 对应SQL语法为WHERE…IN
All: 如果所有的元素都满足给定的断言判定则返回true, 对应SQL语法为WHERE
SequenceEqual: 如果第二个序列包含与输入序列等同的元素则返回true
Contains与Any
Contains方法接受一个类型为TSource的参数, Any接受一个可选的断言(predicate), 如果输入序列包含有给定的元素则Contains返回true:
bool isTrue = new int[] { 23, 34, 4}.Contains (4);
对于Any, 如果表达式能够匹配到至少一个元素, 则返回true, 我们可以用Any重写前面的例子:
bool isTrue = new int[] { 23, 34, 4 }.Any (n => n == 4);
Any可以完成Contains能够的所有事情, 而且可以做得更多:
bool isFalse = new int[] { 23, 34, 4 }.Any (n => n > 50);
调用Any的时候, 如果没有断言判定并且序列包含至少一个元素则永远返回true, 以下是另外一种写法返回与上述例子一致的结果:
bool isFalse = new int[] { 23, 34, 4 }.Where (n => n > 50).Any();
Any对于子查询尤其有用.
All与SequenceEqual
只有当所有元素都满足一个给定断言的时候All才返回true, 以下例子返回那些采购订单金额小于100的客户列表:
dataContext.Customers.Where(c=>c.Purchases.All(p => p.Price < 100));
SequenceEqual用于比较两个序列, 只有当两个序列拥有完全等同的元素, 并且顺序也一直时才返回true
Powered by WordPress