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、First和FirstOrDefauit的区别
(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的形式根据顶端作为参考!!!