联表查询

1.两表查询将结果返回匿名对象

var list = db.Queryable<Student, School>((st, sc) => new JoinQueryInfos(
        JoinType.Left,st.SchoolId==sc.Id))
      .Select((st,sc)=>new{Id=st.Id,Name=st.Name,SchoolName=sc.Name}).ToList();

生成的Sql如下:

SELECT  [st].[ID] AS [id] , 
          [st].[Name] AS [name] , 
          [sc].[Name] AS [schoolName]  FROM [STudent] st 
          Left JOIN School sc ON ( [st].[SchoolId] =[sc].[Id])


2、联表查询将结果返回到新类

实现  a.*,  b.name as bname 

var oneClass = db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(
    JoinType.Left, o.Id == i.OrderId,
    JoinType.Left, o.CustomId == c.Id
))
.Select((o,i,c)=> new ViewOrder// 是一个新类
{
   Id=SqlFunc.GetSelfAndAutoFill(o.Id),// 等于 o.*
   CustomName=c.Name   // 等于 [c].[Name] AS [CustomName]
}).ToList()

Join中Where用法

var oneClass = db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(
    JoinType.Left, o.Id == i.OrderId,
    JoinType.Left, o.CustomId == c.Id
))
.Where(o=>o.id==1) //只用到o这样写就行
.Where((o,i)=>i.xx==1) //如果用到i需要这么写
.Select((o,i,c)=> new ViewOrder //ViewOrder是一个新类
 {
          Id=SqlFunc.GetSelfAndAutoFill(o.Id),// o.*
          CustomName=c.Name   //[c].[Name] AS [CustomName]
}).ToList()

按规则自动填充

需要注意的是 Select用的是自动填充这样使用方便,高并发的地方还是写成上面那种方式

 public class ViewModelStudent : Student
 {
        public string SchoolName{get;set;}// 类名 + 属性名
 }
 var list = db.Queryable<Student, School, DataTestInfo>((st, sc, di) => new JoinQueryInfos(
              JoinType.Left,st.SchoolId==sc.Id,//可以用&&实现 on 条件 and
              JoinType.Left,st.Name==di.String
            ))
           //.Where((st,sc)=>sc.id>0) 多表条件用法
           .Select<ViewModelStudent>().ToList();
 
 //SELECT 
    //sc.[Name] AS [SchoolName],--自动生成 SchoolName
      //st.[ID] AS [Id],st.[SchoolId] AS [SchoolId],
      //st.[Name] AS [Name],st.[CreateTime] AS [CreateTime]
      //FROM [STudent] st
      //Left JOIN [School] sc ON ( [st].[SchoolId] = [sc].[Id] )  
      //Left JOIN [DataTestInfo] di ON ( [st].[Name] = [di].[String] )


3、简单联表

代码:

var list = db.Queryable<Order, OrderItem, Custom>((o, i, c) => o.Id == i.OrderId&&c.Id == o.CustomId)
                .Select<ViewOrder>()
                .ToList();

 sql:

SELECT  c.[Name] AS [CustomName],
        o.[Id] AS [Id],o.[Name] AS [Name],
        o.[Price] AS [Price],
        o.[CreateTime] AS [CreateTime],
        o.[CustomId] AS [CustomId]         FROM [Order] o  ,[OrderDetail]  i ,[Custom]  c  
         WHERE (( [o].[Id] = [i].[OrderId] ) AND ( [c].[Id] = [o].[CustomId] ))