4.4排序(Sorting)

基本需求:用户想数据根据送货城市和邮政编码排序。

解决方案:知道LINQ有一个扩展方法可以根据一个或多个属性排序你一定会很高兴。LINQ to Entities提供了这个方法的实现也一点也不奇怪。在C#中,使用orderby子句。这个子句接受要根据排序的属性。默认情况下,是升序,但是可以在属性后边加上关键字descending实现降序。如果有多个属性是降序,你可以在每个属性后边都加上descending关键字。如SQL中,尽管默认是升序,你依然可以使用ascending指定。下面是例子。

var result = from o in ctx.Ordersorderby o.ShippingAddress.Cityselect o;
var result1 = from o in ctx.Ordersorderby o.ShippingAddress.City, o.ShippingAddress.ZipCode descendingselect o;

我们很少讨论在单独类中的排序,当你根据关联的类的属性排序上将变得更有趣。

4.4.1关联排序

现在用户想在表格的顶部展示最有价值的订单。在本例中,排序根据聚合值而不是单个字段。
幸运的是,这种情况并不复杂,你已经了解了所有的基础。

var result = from o in ctx.Ordersorderby o.OrderDetails.Sum(d => d.Quantity * (d.UnitPrice - d.Discount))select new{o.OrderId,o.OrderDate,o.ShippingAddress,Total = o.OrderDetails.Sum(d => d.Quantity * (d.UnitPrice - d.Discount))};

这个查询的结果是IOrderedQueryable<T>的对象。因为IOrdered-Queryable<T>实现了IEnumerable<T>,它可以使用foreach遍历,数据绑定操作,或另外的枚举机制。

关联数据也可以排序。执行这一操作的唯一方式是使用投影,在匿名类型中创建一个包含排序数据的属性。例如,你可能想查询订单和它们的详细信息,根据数量排序,并绑定到表格中。

当涉及到单独关联时,就更简单了,因为没有聚合需要执行,你可以使用外部属性好像是查询类的属性一样。下面展示的代码片段,查询所有订单,根据顾客所在城市排序。

var result = from o in ctx.Ordersorderby o.Customer.ShippingAddress.Cityselect o;

我们提到在查询中涉及到关联实体时SQL生成器使用映射信息处理表之间的关联。有些情况,当外键不足够关联表时,就必须使用其他列。这种情况下,必须手动处理,重写默认的行为。下一部分,我们讨论这个主题。

4.5 连接数据(Join Data)

当写跨越相关表的查询时,这些连结由SQL生成器自动处理,你不必担心。但是,属性之间存在关系的情况不能使用外键。这种情况下,你可以使用join子句。
我们还没有遇到采取连结的情况。模型的灵活特性和LINQ to Entities的查询能力使连结变得几乎没有用。

下面让我们看一个实例,说明手动连结有多不重要。假设你要查找送货城市和用户所在城市相同的订单。在SQL中,你将使用CompanyId和ShippingCity列连结Order和Company表。在LINQ to Entities中,方法一样,因为当你手动连结对象时,SQL生成器忽略类间的关系。你可以写如下的查询:

单个属性连结

var result = from o in ctx.Ordersjoin c in ctx.Companies.OfType<Customer>()on o.ShippingAddress.City equals c.ShippingAddress.Cityselect o;

多个属性连结

var result = from o in ctx.Ordersjoin c in ctx.Companies.OfType<Customer>()on new { o.ShippingAddress.City, o.Customer.CompanyId }equals new { c.ShippingAddress.City, c.CompanyId }select o;

从上面的代码中可以看出,涉及一个属性的连结和多个属性的连结没有多大区别。在第一个第一段代码中,直接使用需要的属性名称,第二段代码中,你必须创建一个匿名类型,把所有连结的属性放入其中。

上面的代码运行的很好,但是使用Where子句join很容易忽略。这就需要写更少的代码以此保持简洁和可读:

var result = from o in ctx.Orderswhere o.Customer.ShippingAddress.City == o.ShippingAddress.Cityselect o;

不是说一定不使用连结,而是一个精心设计设计模型只需要连结适用于一些始终被评估的特殊情况下。

只返回用户数据对应于join子句中表达的筛选条件的订单.然而,特殊情况下,你可能需要返回即使用户数据不对应于join子句中表达的筛选条件的订单。使用SQL获得这一结果需要使用OUTER JOIN,但是在LINQ to Entities,你必须采用goup join,如下面的代码:

var result = from o in ctx.Ordersjoin c in ctx.Companies.OfType<Customer>()on new { o.ShippingAddress.City, o.Customer.CompanyId }equals new { c.ShippingAddress.City, c.CompanyId }into gfrom item in g.DefaultIfEmpty()select o;

真实世界的模型使用继承,OrderIT也不例外。客户/供应商和产品的情况很大程度上依赖于这个功能,使用继承查询充满复杂性,但LINQ to Entities再次派上了用场。这并不容易,但是当你学会了如何避免陷阱,你就可以跳过这一关。

转载于:https://www.cnblogs.com/nianming/archive/2011/09/03/2164583.html

Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:排序和连接数据...相关推荐

  1. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:使用函数...

    4.7 使用函数 扩展LINQ to Entities查询的简便方法就是使用函数.有四种类型的函数可以应用: 规范函数-LINQ to Entities本身没有提供的一组预定义的函数. 数据库函数-一 ...

  2. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:预先加载和延迟加载...

    4.9 加载(Fetching) 预先加载指在一个查询中加载所有的实体和关联的数据.延迟加载指使用时再加载关联的实体.预先加载是检索数据最高效的方法.尽管它从数据库中检索所有的数据,但是只访问一次数据 ...

  3. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:执行手动查询...

    4.8 执行手动查询 有很多原因决定你会手动写查询.或许由EF生成的SQL太慢,又或许执行起来浪费了太多资源.另一种情况可能是当你动态生成一个如此复杂的查询,创建SQL代码比使用LINQ to Ent ...

  4. Entity Framework 4 in Action读书笔记——第三章:查询对象模型基础(1)

    本章要点: 1.EF查询技术. 2.捕捉生成的SQL. 3.深入理解EF查询引擎. 4.常见的查询陷阱. 一.查询引擎入口点 对象服务层最重要的类是ObjectContext.在你的代码中它是最有用的 ...

  5. Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(三)

    objectstatemanager更改跟踪管理 ObjectStateManager组件(从现在开始称之为 state manager)负责与上下中对象追踪有关的一切: 1.当添加,附加到上下文或者 ...

  6. Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(一)

    本章内容包括: 理解实体状态 理解状态的转换 自动和手动改变状态 我们先从分析实体的生命周期和它的状态开始. 实体生命周期 在其生存期期间,一个实体只有一个状态.在了解如何检索状态之前,先看看什么是实 ...

  7. Entity Framework 4 in Action 读书笔记——开篇

    写在开篇之前 Entity Framework 4 In Action 这本书目前还没有中文版的,大体看了一下目录感觉还不错,如果想从中学到东西还是看原汁原味的好.从淘宝上搜了一下这本书要将近100块 ...

  8. Entity Framework 4 in Action读书笔记——第一章:数据访问重载:Entity Framework(2)...

    上一篇讲解了通用数据容器,这一篇使用类来组织数据. 类是面向对象编程语言的基础.使用类,你不需要知道具体的存储机制,数据源可以是数据库,Web服务,XML文件等.类提供了很多优势,尤其是在企业应用中. ...

  9. Machine Learning in Action 读书笔记---第5章 Logistic回归

    Machine Learning in Action 读书笔记 第5章 Logistic回归 文章目录 Machine Learning in Action 读书笔记 一.Logistic回归 1.L ...

最新文章

  1. 经历一次真实的XSS跨站攻击以及应付之策
  2. C#中的代理(delegate)[转载]
  3. 新增记录行(ecshop)
  4. Python名称空间是什么?
  5. Jquery Uploadify插件+Servlet解决FTP多文件上传
  6. 记一次.net mvc中 RouteAttribute 不起作用
  7. Mac电脑上设置应用程序开机启动详细教程!速来get一下
  8. 【27】Python100例基础练习题6
  9. torch.utils.data
  10. Luogu1390 公约数的和
  11. 计算机无法添加本地策略组,解决win10找不到本地组策略和本地用户的方法
  12. C语言实现埃拉托斯特尼筛法
  13. 三级等保成标配,互联网医院安全架构报告发布
  14. 安旭生物科创板上市:曾遭弃购1400万元,凌世生夫妇控制60%股份
  15. html5清新文艺,清新文艺的短句
  16. Vue-cli 脚手架一
  17. 通过点击按钮打开新的窗口
  18. java去除数组重复元素的四种方法
  19. Uos统信系统本地apt及基础网络,主机名时区配置
  20. 组装电脑主板如何去选

热门文章

  1. [Ext JS ]3.4 数字输入框 numberfield
  2. UCMA(OCS) 开发系列之二(安装与部署)
  3. IPMP 认证考试知识点
  4. Soul 网关源码阅读(四)Dubbo请求概览
  5. app.vue 跳转页面_【在线教学】第8章 网站页面布局和模块设计
  6. java中的强制类型转换注意事项_浅谈Java中强制类型转换的问题
  7. 句子分类_Bert做新闻标题文本分类
  8. php与tp5,PHP开发(33)-ThinkPHP5.0(5)命名空间与TP5-PhpStorm
  9. Java中Comparable接口与Comparator接口
  10. php和ajax实现聊天功能,怎么在PHP项目中使用jquery与ajax实现一个即时聊天功能