Lin语法(Linq对数据库操作和语法使用)

一、Linq语句的应用:

var queryAllCustomers = from cust in customers   
group cust by cust.City into custGroup
where cust.City == "London" && cust.Name.Contains("Devon" )
orderby cust.Name ascending
select cust;

1、 from 子句引入数据源 (customers) 和范围变量 (cust)。

2、where筛选子句(后面是筛选的条件)

      (1):筛选一张表中的字段时:where cust.City == "London" && cust.Name == "Devon"使用&&链接,表示“并且“的意思

      (2):筛选多张表中的字段时:where cust.City == "London" || cust.City == "Paris"使用||链接,表示”或者“的意思

      (3):模糊查询:cust.Name.Contains("Devon" ) 使用Contains(sting类型),表示数据中出现Devon字符串的数据查出来。

3、排序

      (1):order 字段 ascebding :根据字段自动正序排序

      (2):orderby  字段   descending :根据字段自动反序排序

4、分组

      (1):group cust by cust.City into custGroup:group cust by cust.字段名称 into 自定义分组名称

--------------------------------------------------------------------------------------------------------------------------------------------------------------

var queryAllCustomers =customers .Where(o => o.MobilePhone == mobilePhone).FirstOrDefault(); 

5、FirstFirstOrDefauit的区别

      (1):First:如果查询的数据不存在, 则System.InvalidOperationException异常

                   FirstOrDefauit:如果查询的数据不存在, 则返回 null

--------------------------------------------------------------------------------------------------------------------------------------------------------------

var innerJoinQuery =from cust in customers  join dist in distributors on cust.City equals dist.City    select new {
CustomerName = cust.Name,
DistributorName = dist.Name
};

6、 联接的第一种:场景:获取数据之后直接返回赋值

      (1):join dist in distributors on cust.City equals dist.City:join 范围属性 in 表名称 on 第一张表.字段 = 第二张表.字段

      (2):select new { CustomerName = cust.Name, DistributorName = dist.Name }:把第一张表的name和第二张表的name重新定义一个名称!!!

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

var query = from a in db.CommentInfo  join b in db.SysUser on a.UserId equals b.Id into ab  from c in ab.DefaultIfEmpty()  select new{a.Id,c.Name};

7、 联接的第二种:场景:获取数据之后直接返回数值

      (1):join b in db.SysUser on a.UserId equals b.Id into ab  from c in ab.DefaultIfEmpty() :join 范围属性 in 表名称 on 第一张表.字段 = 第二张表.字段 into ab  from c in ab.DefaultIfEmpty()  这样写 b是取不到字段的,因为b赋给c,只能从c中取b的字段,

      (2):select new{a.Id,c.Name};:返回指定的字段!!!

     (3):DefaultIfEmpty() : 返回指定序列的元素;如果序列为空,则返回单一实例集合中的类型参数的默认值。(返回两表连接之后的序列元素)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 8、联接的第三种(查询的数据重新赋值,和第一种没有区别):场景:获取数据之后重新复制

var recordcfm = from p in record join c in craftsmanlist  on p.CraftsmanId equals c.Guid   select new OverviewIntegralDt { ScoreGuid = p.ScoreGuid, };

(1):查询出的数据赋值给new出的新对象OverviewIntegralDt 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

9、联接的第四种(和联表实现的效果是一样的):场景:获取数据之后根据某一个字段查询其他表中的数据(前提是字段和其他表查询出来数据的唯一性,字段一遍)

dto.Items查询出的数据  

 dto.Items.ForEach(d =>{  
GjCraftsman craftsman = _service.Getguid(d.CraftsmanId);
d.Settled = craftsman == null ? 0 : craftsman.State;
});

(1):根据查询出的d.CraftsmanId查询第二张表的craftsman.State然后赋值;

10、分页

      (1):使用sjip和take分页:list = list.Skip(pageNum * pageSize).Take(pageSize).ToList();

                   pageSize:一页多少条

                   pageNum:表示页数,但是正确的页数是pageNum + 1。因为pageNum = 0,是第一页。pageNum = 1的时候,是第二页。

                   Skip:表示从第pageNum*pageSize+1条数据开始,也就是说在这之前pageNum*pageSize条数据。

                   Take:表示显示多少条数据,也就是pageSize条。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

应用场景:比如有两个list集合,第一个集合中有12345第二个集合中有456789,想获取123456789

定义两个List集合

List<String> list1 = new List<String>();
list1.Add("1");
list1.Add("2");
list1.Add("3");
list1.Add("5");
list1.Add("6");

List<String> list2 = new List<String>();
list2.Add("2");
list2.Add("3");
list2.Add("7");
list2.Add("8");

 1、合并

  (1):var bingji = list1.Union(list2).ToList(); 并(全)集,使用Union()把括号中获取的数据与Union()前面获取的数据合并到一起(相同的留一份,不同的都保留!!!)结果:12345678

 2、交集

(1):var jiaoji = list1.Intersect(list2).ToList();//交集,使用Intersect()把括号中获取的数据与Intersect()前面获取的数据中交叉的数据获取出来   结果:23

3、差集

(1):var chaji = list1.Except(list2).ToList();//差集,使用Except()把括号中获取的数据与Except()中双方各自有的    结果:15678

---------------------------------------------------------------------------------------------------------------------------------------------------------------

应用场景:比如返回一个时间字段的数据,有十条数据其中五条是2020年,五条是2021年,现在我只想返回两个不同的时间,2020和2021,所以用到了distinct()方法,

var innerJoinQuery =from cust in customers  select new { CustomerName = cust.Name}.toslist().distinct();

 4、返回不同的数据()

  (1):使用distinct()从序列中返回不同的数据,

5、去重   Distinct()

List<LEDXinXiDto>  bingRenXXList = bingRenXXList.Distinct(new XiYaoLEDEqualityComparer()).ToList();

public
class XiYaoLEDEqualityComparer : IEqualityComparer<LEDXinXiDto> { public bool Equals(LEDXinXiDto x, LEDXinXiDto y) { if (x == null && y == null) { return true; } else if (x == null || y == null) { return false; } else { return x.BINGRENXM == y.BINGRENXM; } } public int GetHashCode(LEDXinXiDto obj) { return 1; } }

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------

应用场景:获取分组后每个分组的名称和个数,(重新映射到partresulte的类)

var query = (from a in db.Shop
where a.isdeleted == 0 && deptId == 1 ? a.deptId == deptId : true
group a by a.deptId into grouped
select new partresults
{
Commonname = dict.Where(w => w.Id == grouped.Key).FirstOrDefault().Name,
number = grouped.Count()
});

 1、grouped.Key是分组后的合集名称

 grouped.Count()是合集的个数

---------------------------------------------------------------------------------------------------------------------------------------------------------------

二、Linq连接数据库:

1、首先创建一个Linq to sql类

2、视图中找到服务器资源管理器

3、连接数据库,创建Linq to sql类,把表拖拽到Linq to sql类中

4、Web.config中创建连接数据库的字符串

  (1):<add name="BroadcastScreenConnectionString" connectionString="Data Source=.;Initial Catalog=BroadcastScreen;User ID=sa;Password=wbf2368864112."

  5、创建一个普通类class1

       (1):public static string sqlconnectionstring=configurationManager.ConnectionStrings[“BroadcastScreenConnectionString”].ConnectionString;

         (2): public DataClasses1DataContext db = new DataClasses1DataContext(SqlConnectionString);

       (3):public class Class1: System.Web.UI.Page,继承System.Web.UI.Page,这个方法是创建web项目时自带的,只不过放到了这里被继承,然后web项目再继承连接数据库的类,这样做的目的是为了把连接字符串的方法改成公共类

  6、web项目public partial class WebForm1 : Class1

7、增删改查:

   (1)、(增)article c = new article(); article:表名,把c表中需要的字段赋值,完成后db.article.InsertOnSubmit(c);  db.SubmitChanges();这两句的作用:把需要添加的数据添加到相应的数据库中

   (2)、(删)db.ExecuteCommand("UPDATE SiteInfo SET IsDeleted = 1 WHERE Id=1

                ExecuteCommand作用:直接对数据库执行sql命令

   (3)、

(改)  var sql = from b in db.article where b.id == 1118 select b;
先根据linq语句条件id查到想修改的数据,sql.name=“黄桃”,对象点字段的形式把需要修改的字段修改完成后再用 db.SubmitChanges();
把修改完成的数据修改到相应的数据库中;

或者   

var ActiInfo = db.ActiInfoShare.SingleOrDefault(a => a.Id == RequestHelper.GetInt("id", 0) && a.Isdeleted == 0);
SingleOrDefault()先根据唯一条件获取数据,如果多个条件的话会报错,然后 ActiInfo.Title = “好卡激活手机客户端卡死”;然后用 db.SubmitChanges();
对数据库做出相应的修改!!!!

 

  (4)、(查) 查询根据linq查询数据,linq的形式根据顶端作为参考!!!

posted @ 2021-06-08 11:50  猴猴手记  阅读(603)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end