有这样的一个需求,查询一张表的时候,需要查询某条数据在其关联表中的总数。这样的表达看起来比较白痴。用一个例子做下说明。
一共2张表,暂且将他们的名字设置为:table_1
和table_2
。
table_1
的字段为:id
、name
。id
为主键,name
为名称;
table_2
的字段为:id
、t1_id
、name
。id
为主键,t1_id
为table_1
的id
,name
为名称;
那么分页查询table_1
的时候,需要列出table_2
中t1_id
一共有多少条数据,也就是下面这种样子:
表table_1
的分页数据:
id | name | t2_total |
---|---|---|
1 | 电脑 | 3 |
2 | 手机 | 8 |
由于使用的是SqlSugar
。在其官网找到了办法。比自己写要简单的多了。
public async Task<List<table_1_dto>>GetPageListAsync()
{
return await db.Queryable<table_1>()
.Select(t1=>new table_1_dto{
id=t1.id.SelectAll(),
t2_total = SqlFunc.Subqueryable<table_2>().Where(t2=> t2.t1_id == t1.id).Select(t2=>SqlFunc.AggregateCount(t2.id))
})
.MergeTable()
.ToListAsync()
}
十分简单,不得不佩服SqlSugar
确实很强大。
需要注意的是,这里使用了.Select(t2=>SqlFunc.AggregateCount(t2.id))
而不是直接Count()
当然使用Count()
没有任何问题,关键在于生成的SQL语句。如果使用Count()
,生成的SQL子查询是类似于这样的:SELECT COUNT(*) FROM table_2 WHERE t1_id=t1.id
。而使用Select(t2=>SqlFunc.AggregateCount(t2.id))
的话。生成的SQL子查询是类似于这样的:SELECT TOP 1 COUNT(id) FROM table_2 WHERE t1_id=t1.id
。
好处自然不言而喻了吧。
做此记录,下回忘了还可以回来看看。不用再跑到官网上挨个去看啦!