[LINQ2Dapper]最完整Dapper To Linq框架(六)---多表联合与匿名类型返回
目录
- [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询
- [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询
- [LINQ2Dapper]最完整Dapper To Linq框架(三)---实体类关系映射
- [LINQ2Dapper]最完整Dapper To Linq框架(四)---Linq和SQL并行使用
- [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq实际执行的SQL
- [LINQ2Dapper]最完整Dapper To Linq框架(六)---多表联合与匿名类型返回
- [LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式
- [LINQ2Dapper]最完整Dapper To Linq框架(八)---导航属性
1.多表联合查询
默认情况下Where,Get,ToList,PageList等函数只支持单表操作,
如
var comment = conn.QuerySet<Comment>()
.Where(x => x.Id.NotIn(new int[] { 1, 2, 3 })
&& x.SubTime.AddMinutes(50) < DateTime.Now.AddDays(-1)
&& x.Type.IsNotNull())
.ToList();
3.1.2后支持双表和三表同时映射操作,需要通过From函数指定映射表,
如
var comment = conn.QuerySet<Comment>()
.From<Comment, News, ResourceMapping>()
.Where((a, b, c) => a.Id == 1
&& b.Headlines.IsNotNull()
&& c.RSize > 100);
也可以通过GetQuerySet()返回基础的QuerySet对象
var comment = conn.QuerySet<Comment>()
.From<Comment, News, ResourceMapping>()
.Where((a, b, c) => a.Id == 1
&& b.Headlines.IsNotNull()
&& c.RSize > 100)
.GetQuerySet()
.ToList();
以上是三表联合查询,如果有更多表联合需求可以通过自己扩展实现,
如
/// <summary>
/// 定义一个四表联合扩展类
/// </summary>
/// <typeparam name="T">对应QuerySet的泛型</typeparam>
/// <typeparam name="T1">扩展泛型1</typeparam>
/// <typeparam name="T2">扩展泛型2</typeparam>
/// <typeparam name="T3">扩展泛型3</typeparam>
/// <typeparam name="T4">扩展泛型4</typeparam>
public class testFrom<T, T1, T2, T3,T4> : ISelect<T>
{
public testFrom(QuerySet<T> querySet) : base(querySet)
{ }
//定义了一个Where
public testFrom<T, T1, T2, T3,T4> Where(Expression<Func<T1, T2, T3,T4, bool>> select)
{
base.Where(select);
return this;
}
//定义了一个ToList
public IEnumerable<TReturn> ToList<TReturn>(Expression<Func<T1, T2, T3,T4, TReturn>> select)
{
return base.ToList<TReturn>(select);
}
}
然后使用扩展类
//首先声明一个QuerySet
var querySet = conn.QuerySet<Comment>();
/*把定义的querySet实例带入到扩展类中
(注意:第一个T类型必须对应querySet的泛型,如Comment)*/
var list = new testFrom<Comment, Comment, News, ResourceMapping, LikeRecord>(querySet)
.Where((a, b, c, d) => a.Id == 1
&& b.NewsLabel.Contains("t"))
.GetQuerySet()
.ToList();
以此类推,可以任意扩展联表的数量
以下是支持的函数
public class ISelect<T>
{
public ISelect(QuerySet<T> querySet); public TReturn Get<TReturn>(LambdaExpression exp);
public QuerySet<T> GetQuerySet();
public ISelect<T> OrderBy<TProperty>(Expression<Func<TProperty, object>> field);
public ISelect<T> OrderByDescing<TProperty>(Expression<Func<TProperty, object>> field);
public PageList<TReturn> PageList<TReturn>(int pageIndex, int pageSize, LambdaExpression exp);
public IEnumerable<TReturn> ToList<TReturn>(LambdaExpression exp);
public QuerySet<T> Where(LambdaExpression exp);
}
2.结果返回匿名类型
3.12版本后支持返回匿名类型,
如
var comment = conn.QuerySet<Comment>()
.Where(x => x.Content == "test1" && x.Content.Contains("t"))
.Get(x => new
{
Id = 123,
ArticleId = x.ArticleId
});
一些复杂的字段返回可以通过sql实现,
例如
var comment = conn.QuerySet<Comment>()
.Join<Comment, News>((a, b) => a.ArticleId == b.Id)
.Where(x => x.Content == "test1" && x.Content.Contains("t"))
.Where<Comment, News>((a, b) => a.SubTime < DateTime.Now.AddDays(-5) && a.Id > a.Id % 1)
.Get(x => new
{
count = Convert.ToInt32("(select count(1) from Comment_4)"),
aaa = "6666",
});
并且也支持联合查询的返回
var comment = conn.QuerySet<Comment>()
.Join<Comment, News>((a, b) => a.ArticleId == b.Id)
.Join<Comment, ResourceMapping>((a, b) => a.Id == b.FKId)
.Where(x => x.Content == "test")
.From<Comment, News, ResourceMapping>()
.OrderBy<News>(x => x.Id)
.Where((a, b, c) => a.ArticleId == b.Id)
.PageList(1, 10, (a, b, c) => new
{
id = a.Id,
name = b.NewsLabel,
resource = c.RPath,
rownum = Convert.ToInt32("ROW_NUMBER() OVER(ORDER BY Comment.Id)"),
NewsLable = "News.NewsLabel"
});
还支持比较复杂的子查询
子查询支持的函数有 Count() Sum<T>(字段)
例如
var comment1 = conn.QuerySet<Comment>()
.Join<Comment, News>((a, b) => a.ArticleId == b.Id)
.Where(x => x.Id.Between(80, 100)
&& x.SubTime.AddDays(-10) < DateTime.Now && x.Id > 10)
.From<Comment, News>()
.Get((a, b) => new
{
//(不查询数据库的方法可以任意使用)
test = new List<int>() { 3, 3, 1 }.FirstOrDefault(y => y == 1),
aaa = "6666" + "777",
Content = a.Content + "'test'" + b.Headlines + a.IdentityId,
//此字段会拼接成子查询,不用担心循环查询造成的性能问题
bbb = new QuerySet<Comment>(conn, new MySqlProvider())
.Where(y => y.ArticleId == b.Id && y.Content.Contains("test")).Sum<Comment>(x => x.Id),
ccc = a.IdentityId,
ddd = Convert.ToInt32("(select count(1) from Comment)")
});
完整Demo可以去Github上下载:
https://github.com/a935368322/Kogel.Dapper.Test
如有问题也可以加QQ群讨论:
技术群 710217654
框架开源,可以加群下载源码
[LINQ2Dapper]最完整Dapper To Linq框架(六)---多表联合与匿名类型返回的更多相关文章
- [LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
- [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询
此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper 支持.net framework4.5.1 ...
- [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
- [LINQ2Dapper]最完整Dapper To Linq框架(三)---实体类关系映射
此特性需要安装Kogel.Dapper.Mssql或者Oracle 3.06及以上版本,实体类层需要安装Kogel.Dapper.Extension 3.06及以上版本 目录 [LINQ2Dapper ...
- [LINQ2Dapper]最完整Dapper To Linq框架(四)---Linq和SQL并行使用
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
- [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq实际执行的SQL
此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper支持.net framework4.6.1及 ...
- [LINQ2Dapper]最完整Dapper To Linq框架(八)---导航属性
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
- Linq To Sql多表联合查询
var pro = (from ps in db.ProductInfoes join pt in db.ProductTypees on ps.productType equals pt.pType ...
- 基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【六】【引入bootstrap前端框架】
https://blog.csdn.net/linzhefeng89/article/details/78752658 基于springboot+bootstrap+mysql+redis搭建一套完整 ...
随机推荐
- 安装、卸载 cocoapods
卸载cocoapods: localhost:~ je$ sudo gem uninstall cocoapods Remove executables: pod, sandbox-pod in ad ...
- 本人亲测-SSM环境搭建(使用eclipse作为示例,过程挺全的,可作为参考)
本人亲测-SSM环境搭建(使用eclipse作为示例,过程挺全的,可作为参考) 本人亲测-SSM环境搭建(使用eclipse作为示例,过程挺全的,可作为参考) 本人亲测-SSM环境搭建(使用eclip ...
- CS184.1X 计算机图形学导论 第3讲L3V1
二维空间的变换 L3V1这一课主要讲了二维空间的变换,包括平移.错切和旋转. 缩放 缩放矩阵 使用矩阵的乘法来完成缩放 缩放矩阵是一个对角矩阵,对角线上的值对应缩放倍数 错切(shear) 错切可以将 ...
- python常用算法(5)——树,二叉树与AVL树
1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...
- App自动化之坐标定位
1.如下图定位"去看看"这个按钮的坐标,可以看到右侧bonds属性:[374,831][654,906] 2.点右上角"搜索"按钮,查看bonds属性:[615 ...
- 第3章(3) do{}while(0)语句
do {} while (0) 主要在宏定义后为语句中使用,比如: #define macrofun(a, b, c) \ do { \ if (a == 5) \ do_this(b, c); \ ...
- JavaScript回调函数和递归函数
一.回调函数--通过函数的指针来调用函数 把一个函数的指针作为另一个函数的参数,当调用这个参数的时候,这个函数就叫做回调函数 在链式运动上会用到回调函数,之后运动会见到 A.通过指针来调用函数 B.通 ...
- 并发编程之Fork/Join
并发与并行 并发:多个进程交替执行. 并行:多个进程同时进行,不存在线程的上下文切换. 并发与并行的目的都是使CPU的利用率达到最大.Fork/Join就是为了尽可能提高硬件的使用率而应运而生的. 计 ...
- 百万年薪python之路 -- 迭代器
3.1 可迭代对象 3.1.1 可迭代对象定义 **在python中,但凡内部含有 _ _ iter_ _方法的对象,都是可迭代对象**. 3.1.2 查看对象内部方法 该对象内部含有什么方法除了看源 ...
- electron开发环境搭建
开发环境 Node.js Vscode vscode安装Debugger for Chrome 创建开发目录(也是解决方案) 执行初始化命令,创建electronpicture工程,并添加main.j ...