目錄
- [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封裝,效率優於EntityFramwork,並且支持.NetFramework和.NetCore框架,只依賴於Dapper
支持.net framework4.5.1及以上
支持.net core2.0及以上
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
框架開源,可以加羣下載源碼