linq 的join多表和select使用,let变量

join 分为inner join,left join ,cross join

select 分为select 和selectmany

通俗的来说 查询 有 平面查询和层次查询,关联有内关联和外关联

所以说根据项目中实际运用的情况,来选择是 inner join 还是 left join 而且是平面还是层次

inner join :

var  query = from a in tb1 join b in tb2  on a.id  equals  b.id select new { }

var  query = from a in tb1 join b in tb2  on  new{id=a.id}   equals  new{id=b.id}  select new { }
 

left join : 一定要DefaultIfEmpty()  但是left join完之后再where条件跟inner join查询结果一样 举个sql写法的例子

正常sql 的 left join 之后 where 和 and 写法会不一样 left join之后 where 就跟inner join一样了

这个就等同于 and

var query = from s in db.tbStudents
                            join c in db.tbClass  where c.ClassID == 3  on s.ClassID equals c.ClassID into g
                            from c in g.DefaultIfEmpty()                           
                            select new
                            {
                                
                            };

这个就等同于 where  虽然是left join  但是where条件查出来结果 跟inner join 效果相同

var query = from s in db.tbStudents
                            join c in db.tbClass on s.ClassID equals c.ClassID into g
                            from c in g.DefaultIfEmpty()
                            where c.ClassID == 3
                            select new
                            {
                                
                            };

 

分组: 一定要into

 var lineCount = from line in det.Org_DetectLine
                                    group line by line.StaID into g
                                    select new
                                    {
                                       StaID =  g.Key,
                                       LineCount = g.Count()
                                    };

 

有时候遇见主表从表都会有条件的情况,那么想一次查询出来的时候,直接在查询的过程中加入条件

var query =
                from c in dataContext.Main
                where c.Minor.Any (p => p.Price > 1000)
                select new
                {
                    c.Name,
                    Minor= from p in c.Minor  where p.Price > 1000
                                select new { p.Description, p.Price }
                };

这样可以满足,但是可以看到查的时候条件用了俩次,一次查,一次保存赋值,那么用let的话可以一次达到目的

var query =
                from c in dataContext.Main
                let Replace= from p in c.Minor
                                 where p.Price > 1000
                                 select new { p.Description, p.Price }
                where Replace.Any()
                select new { c.Name, Minor= Replace};

定义一个let变量来表示从表,这样select 去赋值的时候就是已经带有条件的从表数据了,省去了一次赋值

 

 

复合from子句实际上就是联接查询,大部分复合from子句(并不是所有,如cross join)的Linq完全可以用join子句的Linq来重写,两者生成的Sql也相同,推荐使用join Linq,这种写法与Sql更接近,更易读 

也就是说inner join,left join 使用from复合语句 或者是join 的写法都是没有啥区别的


var query1 = from o in dbContext.Orders
            from od in o.Order_Details
            select o;
 
var query2 = from o in dbContext.Orders
             join od in dbContext.Order_Details
             on o.OrderID equals od.OrderID

 

cross join:  俩个没有关联的表 才能为cross join  有关联的 只能是 inner 或 left join

如果from的对象均用表名,(from a in 表1  from b in 表2),则会转换成cross join   

复合from语句其实就是 方法写法中的 selectmany 的用法

var query = db.Customers
              .Where(c => c.CustomerID == "ALFKI")
              .SelectMany(
                 c => db.Orders.Where(o => c.CustomerID == o.CustomerID),
                 (c, o) => new { c.ContactName, o.OrderDate }
                 );

selectmany只是复合from  也就是俩个from的语句 它可以是inner join也可以left  cross。因为from 复合语句只有俩个不关联的表

才是cross join。它可以复合关联的表。

 

selectmany 的用法还可以用来简便二重循环的情况


  //IEnumerable<Book>.Select 将序列中的Authors元素投影到新表中.
            IEnumerable<List<Author>> EnumerableOfListOfAuthors = Books.Select(book => book.Authors);
 
            foreach (var listOfAuthors in EnumerableOfListOfAuthors)
            {
                foreach (Author auth in listOfAuthors)
                {
                    Output.Items.Add(auth.Name); //添加到ListBox里面
                }
            }
 
            //IEnumerable<Book>.SelectMany  将序列的每个元素投影到 IEnumerable<T> 并将结果序列合并为一个序列。
            IEnumerable<Author> authors = Books.SelectMany(book => book.Authors);
            foreach (Author auth in authors)
            {
                Output2.Items.Add(auth.Name);
            }

linq中还有一个 group join  是为了方便结果出来之后再分组

var list =     (from c in db.Customers
join p in db.Purchases on c.ID equals p.CustomerID
into custPurchases
select new
{custPurchases,c.Name}).ToList ();

inner join 出来数据 可能又想分组 那就需要 into 一个结果集 然后把结果集当一个字段显示

一些列子:可以参考

https://www.cnblogs.com/ASPNET2008/archive/2008/12/19/1357690.html

https://www.cnblogs.com/ASPNET2008/archive/2008/12/21/1358152.html

https://blog.csdn.net/simulationpd/article/details/83416869

https://www.cnblogs.com/shenqiboy/p/3260105.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
清晰完整PDF版本,是我从网上买来的 共 150MB,分为13个分卷 在 CSDN 上只有我整个是清晰完整的 LINQ 入门及应用 .NET 2010 SQL LINQ入门及应用 10/13 原价:48.00元 作者:王的强,张晓娜,周静 编著 出版社:清华大学 出版日期:2009-5-1 ISBN:9787302200253 字数:661000 页码:427 -------------------------------------------------------------------------------- 本书介绍微软最前沿的数据查询编程技术,内容由160个知识点实例加5个综合应用案例组成,光盘中提供了涉及到的全部示例源程序项目,对于将要从事正规商业开发的人员有很强的示范性和指导作用。 内容提要 -------------------------------------------------------------------------------- 本书系统、全面地介绍了微软最新推出的LINQ数据开发技术。   本书采取以实践为主、以理论为辅的方法,首先对C#新改进的一些语法做了详细的剖析,让读者领会C#语法的新特点,为后面的学习打下基础,然后对LINQ各个子句和组件进行了实例讲解,通过一个个生动的示例,带领读者由浅入深、系统地学习和掌握LINQ技术。   本书对开发步骤的详细介绍,有助于读者更好地掌握Microsoft Visual Studio 2008开发环境。各个章节中的综合实例,除了充分演示LINQ技术外,还努力引导读者适应面向对象的开发方式。   配书光盘中提供了书中所有的源程序(均为VS2008应用项目),全部项目均经过严格的测试并通过。   本书可供相关技术研究人员、广大.NET应用程序开发人员和用户参考,也可作为高等院校计算机、电子商务以及信息类专业的教材。 目录 -------------------------------------------------------------------------------- 第1章 LINQ介绍  1.1 什么是LINQ  1.2 为什么要用LINQ  1.3 搭建LINQ开发环境   1.3.1 安装 Visual Studio 2008   1.3.2 配置 Visual Studio 2008  1.4 初识LINQ技术   1.4.1 初识LINQ to Objects   1.4.2 初识LINQ to ADO.NET   1.4.3 初识LINQ to XML  1.5 小结 第2章 C#语言的新特性及相关知识  2.1 .NET各个版本之间的关系  2.2 C#语言的新特性   2.2.1 自动属性和属性访问器的保护级别   2.2.2 可空类型   2.2.3 泛型   2.2.4 代理   2.2.5 迭代器与yield关键字   2.2.6 隐式类型的局部变量   2.2.7 对象和集合初始化器   2.2.8 匿名类型   2.2.9 扩展方法   2.2.10 匿名方法和Lamdba达式  2.3 综合实例:C#高亮编辑及编译运行器  2.4 小结 第3章 LINQ基本子句介绍  3.1 概述  3.2 from子句   3.2.1 单个from子句   3.2.2 复合from子句   3.2.3 多个from子句  3.3 where子句   3.3.1 常见的where子句查询   3.3.2 在where子句中使用自定义函数   3.3.3 动态谓词的筛选  3.4 select子句   3.4.1 输出查询结果   3.4.2 对查询结果进行投影  3.5 group子句   3.5.1 IGrouping泛型接口   3.5.2 分组查询  3.6 into子句  3.7 排序子句   3.7.1 OrderBy和OrderByDescending   3.7.2 ThenBy和ThenByDescending  3.8 let子句  3.9 join子句  3.10 小结 第4章 用于集合、文件、字符串对象的LINQ(LINQ to Objects)  4.1 LINQ标准查询运算符概述  4.2 Enumerable类的介绍  4.3 用于延期执行的Enumerable类方法成员   4.3.1 Take方法   4.3.2 TakeWhile方法   4.3.3 Skip方法   4.3.4 SkipWhile方法   4.3.5 Take、TakeWhile、Skip、SkipWhile小结   4.3.6 Reverse方法   4.3.7 Distinct方法   4.3.8 Union方法   4.3.9 Concat方法   4.3.10 Intersect方法   4.3.11 Except方法   4.3.12 Range方法   4.3.13 Repeat方法   4.3.14 Empty方法   4.3.15 DefaultIfEmpty方法   4.3.16 Cast方法   4.3.17 OfType方法   4.3.18 AsEnumerable方法  4.4 用于立即执行的Enumerable类方法成员  4.5 综合实例  4.6 小结 第5章 用于数据库访问的LINQ (LINQ to SQL) 第6章 用于XML访问的LINQ (LINQ to XML) 第7章 综合应用实例:商品管理解决方案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值