欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

linq2db.EntityFrameworkCore 介绍

程序员文章站 2024-01-22 18:25:28
"linq2db.EntityFrameworkCore" 是一个ef core的插件,对linq语法的扩展 对复杂的sql都有很好的支持,他是基于linq2db (provided by LINQ To DB) 如果你使用了linq2db的语法扩展那么你必须使用下面的方法进行查询 下面是 linq ......

linq2db.entityframeworkcore 是一个ef core的插件,对linq语法的扩展

对复杂的sql都有很好的支持,他是基于linq2db (provided by linq to db)

如果你使用了linq2db的语法扩展那么你必须使用下面的方法进行查询

 // tolinqtodb是必须的
 var temp = qry.tolinqtodb().tolist();

下面是 linq2db 的冰山一角

join

1. innerjoin

 var qry = from t1 in db.t
           from t2 in db.t2.innerjoin(m => m.t1id == t1.id)

2.leftjoin

 var qry = from t1 in db.t
           from t2 in db.t2.leftjoin(m => m.t1id == t1.id)

3.rightjoin

 var qry = from t1 in db.t
           from t2 in db.t2.rightjoin(m => m.t1id == t1.id)

sum

// 相比于原来linq,简洁了很多。
var qry = from t1 in db.t
          from t2 in db.t2.leftjoin(m => m.t1id == t1.id)
          select sql.ext.sum(t1.type == "a" ? t1.number * (t1.saleprice-t2.originalprice) : 0).tovalue();

countext

//我要查t2中不重复的 t1的id有多少个
var qry = from t1 in db.t
          from t2 in db.t2.leftjoin(m => m.t1id == t1.id)
          where t1.some==''
          group new {t1,t2} by t2.some into g
          select new 
          {
              //相当于sql count(distinct t2.t1id)
              number = g.countext(m => m.t2.t1id, sql.aggregatemodifier.distinct)
          }

对于一些sql函数的支持

datepart

var qry = from t1 in db.t
                    where t1.saledate > begintime 
                    group t1 by sql.datepart(sql.dateparts.month, t1 .saledate) into g
                    select new
                    {
                        month = g.key,
                        flowamount = g.sum(m => m.saleway == "a" ? sql.abs(m.number * m.saleprice) : 0) -
                                     g.sum(m => m.saleway == "b" ? sql.abs(m.number * m.saleprice) : 0)
                    };

当然还有更多的扩展方法,分别位于
包含于 sql , sql.ext,analyticfunctions 中
linq2db文档 :

当然还有批量更新的操作

如果是需要使用,那么最好再程序开始时运行以下代码

//因为他是幂等的 ,所以可以多次运行
linqtodbforeftools.initialize();

以下代码都是从github上抄下来的。

// fast insert big recordsets
ctx.bulkcopy(new bulkcopyoptions {...}, items);

// query for retrieving products that do not have duplicates by name
var query =
    from p in ctx.products
    from op in ctx.products.leftjoin(op => op.productid != p.productid && op.name == p.name)
    where sql.tonullable(op.productid) == null
    select p;

// insert these records into the same or another table
query.insert(ctx.products.tolinqtodbtable(), s => new product { name = s.name ... });

// update these records by changing name based on previous value
query.update(prev => new product { name = "u_" + prev.name ... });

// delete records that matched by query
query.delete();