假设你有一个父表(例如:汽车),其关联一个子表,例如轮子(一对多)。现在你想对于所有的父表汽车,遍历所有汽车,然后打印出来所有轮子的信息。默认的做法将是:

SELECT CarId FROM Cars;

然后对于每个汽车:

SELECT * FROM Wheel WHERE CarId = ?

这会SELECT 2个表一共N(主表的行数)+1(父表)次,故称为SELECT N+1问题。

考察下面的代码。假设ProvinceMeeting是一个会议表,MeetSign是另外一个会议签到表,ProvinceMeeting和MeetSign是一对多的关系:

不推荐的写法:

                        var Ids = container.ProvinceMeeting.Select(f => f.Id).ToList();
var SignEntities = container.MeetingSign.ToList();
foreach (var Id in Ids)
{
var sign = container.MeetingSign.Where(f => f.MeetingId == Id);
}

每次循环都会连接数据库,执行一条sql语句,select N + 1问题,很消耗性能。

改善后的写法:

                       //这是我曾经的写法,先遍历获取主表和所有的子表数据存储在数组中,然后再foreach循环查询取出每个主表对应的子表信息,
var Entities = container.ProvinceMeeting.ToList();
var SignEntities = container.MeetingSign.ToList();
foreach (var item in Entities)
{
var sign = SignEntities.Where(f => f.MeetingId == item.Id);
}

我们知道foreach会强制LINQ执行,于是,我们可以想象这也是一个SELECT N+1问题的例子:先获得所有ProvinceMeeting(SELECT * FROM ProvinceMeeting),然后遍历,再去SELECT 表MeetingSign,共SELECT N+1次。(当然这里我把数据都啦取出来,储存在内存中,进行操作相当也查询了两次,但随后我还要遍历循环操作数组)。

解决方法:使用一个匿名对象作为中间表格,预先将两个表join到一起

最佳写法:

var  results = container.ProvinceMeeting.Select(f => new { f.Id, son = f.MeetingSign });

我们对结果添加监听,执行效果如下:

主表和子表对应的关联数据,绑定在了一起,不止代码简单,执行效率也高出了不少!

使用linq语句进行联表查询的更多相关文章

  1. FreeSql (十七)联表查询

    FreeSql在查询数据下足了功能,链式查询语法.多表查询.表达式函数支持得非常到位. IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnect ...

  2. [慢查优化]联表查询注意谁是驱动表 & 你搞不清楚谁join谁更好时请放手让mysql自行判定

    写在前面的话: 不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程: 不要求每个人一定知道线上(现在或未来)哪张表数据量大,哪张表数据量小: ...

  3. (转)MySQL联表查询

    资料源于网络   一.内联结.外联结.左联结.右联结的含义及区别在SQL标准中规划的(Join)联结大致分为下面四种:1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结.2 ...

  4. Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题

    Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题 表更描述: 将mysql数据库中的worktask表添加ishaspic字段. 具体操作:(1)数据库worktask表新添是否有图片字 ...

  5. 【转】[慢查优化]联表查询注意谁是驱动表 & 你搞不清楚谁join谁更好时请放手让mysql自行判定

    转自:http://zhengyun-ustc.iteye.com/blog/1942797 写在前面的话: 不要求每个人一定理解 联表查询(join/left join/inner join等)时的 ...

  6. SQL联表查询

    数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(tab ...

  7. sql学习笔记(三)—— 联表查询

    上篇写了一些sql查询的知识,这篇接着写一下有关联表查询的知识. 既然是联表查询,那肯定得多个表啊,所以,我们先创建一个教师表,表名为 teacher,并且向表中插入数据. 准备工作: 创建表语句: ...

  8. MyBatis联表查询

    MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...

  9. Django之model联表:一对多、跨表操作,联表查询

    表结构概述 model.py : class Something(models.Model): name = models.CharField(max_length=32) class UserTyp ...

随机推荐

  1. setting-mirrorO以及下载jar包流程简介

    mirrorOf常见的几种配置如下 1.* 2.repo3 3.repo1,repo2,*,!repo3 4.external:* 第二个例子只配置了一个repo3,这个镜像只能匹配id是repo3的 ...

  2. web自动化测试---第一个自动化测试用例

    测试环境搭建好之后就可以写自动化测试脚本了,我们以baidu为例,写一个自动化测试脚本 from selenium import webdriver import time driver = webd ...

  3. eclipse引入php源包

    首先安装这些yum install gcc gcc-c++ kernel-devel autoconf automake libtool bison re2c gdb 导入时,如果有这个报错的话 Pr ...

  4. 源码编译安装lnmp环境

    一.源码编译安装步骤 首先说明源码安装的好处   速度快,可自定义路径 主要有三步:1.配置 进入源码安装包  ./configure --prefix=/uer/local/nginx  可指定参数 ...

  5. python 多环境共存 基础

    正在学习python 使用的是3.3 但是由于种种原因吧 还得使用python2.7 所以记录一下 如何安装2个版本 假设 在windows 下面安装的python 版本 和路径 如下 python ...

  6. Kafka项目实战-用户日志上报实时统计之应用概述

    1.概述 本课程的视频教程地址:<Kafka实战项目之应用概述> 本课程是通过一个用户实时上报日志来展开的,通过介绍 Kafka 的业务和应用场景,并带着大家搭建本 Kafka 项目的实战 ...

  7. JAVA 注解的基本原理

    以前,『XML』是各大框架的青睐者,它以松耦合的方式完成了框架中几乎所有的配置,但是随着项目越来越庞大,『XML』的内容也越来越复杂,维护成本变高. 于是就有人提出来一种标记式高耦合的配置方式,『注解 ...

  8. 检测到是移动端还是PC端进入页面,加载不同样式表现

    if(/AppleWebKit.*mobile/i.test(navigator.userAgent) || (/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alc ...

  9. SQL语句简单笔记

    Create database database name://创建数据库 Show databases dbName: //显示所有数据库 Create table tableName: //创建表 ...

  10. C# 线程间互相通信 AutoResetEvent和ManualResetEvent

    C#线程间互相通信主要用到两个类:AutoResetEvent和ManualResetEvent. 一.AutoResetEvent AutoResetEvent 允许线程通过发信号互相通信,线程通过 ...