LinQ - - 集成化查询语言

LinQ to SQL
LinQ - 集成化查询语言。
LINQ  语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展。
      它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。
    LinQ to SQL ——查询SQLServer数据库
    LinQ to Object    —— 查询内存中的集合

ORM思想:O - R - M
Object 对象——实体类
Relation 关系数据库——数据库中的表
Mapping 映射——把类和表;字段和列 对应。

LinQ生成实体类的结构:
1.生成一个DataContext类。相当于程序内存和硬盘数据库之间的桥梁。
2.生成一系列的实例类,与表是一一对应的。
3.每个实体类中都有与表中列相应的属性(值类型的属性都是可以为空的类型bool? int? double?)
int? a=null;//可以为空的类型
System.Nullable<bool> _Sex;
System.Nullable<System.DateTime> _Birthday;
4.数据库中表和表之间的关联关系,被转化成内存中类中的成员变量。

一、增
1.造对象
2.跟context说一声
3.context提交
例:
        //创建内存对象与数据库之间的桥梁
        MyDBDataContext context = new MyDBDataContext();

        //第一步:造实体对象
        Info data = new Info();
        data.Code = "p101";
        data.Name = "张飞";
        data.Sex = true;
        data.Nation = "n001";
        data.Birthday = new DateTime(1990, 3, 15);

        //第二步:跟Context说一下,提交的时候对它执行插入操作
        context.Info.InsertOnSubmit(data);

        //第三步:提交
        context.SubmitChanges();

二、删
1.从数据库中找出来
2.跟context说一下,提交的时候,删除
3.提交

        //创建内存对象与数据库之间的桥梁
        MyDBDataContext context = new MyDBDataContext();

        //第一步:找出要删除的对象。
        //var query = from p in context.Info where p.Code == "p101" select p;
        var query = context.Info.Where(p => p.Code == "p101");
        Info data = query.First();
       
        //第二步:跟Context说一下,提交的时候把这个对象给删掉。
        context.Info.DeleteOnSubmit(data);
        //第三步:提交
        context.SubmitChanges();

三、改
1.从数据库中找出对象来
2.把对象的值改一下。
3.提交送回去。

        //创建内存对象与数据库之间的桥梁
        MyDBDataContext context = new MyDBDataContext();

        //第一步:从数据库找出对象来
        var query = context.Info.Where(p=>p.Code == "p009");
        Info data = query.First();

        //第二步:改
        data.Name = "田七";
        data.Sex = false;

        //第三步:提交
        context.SubmitChanges();

四、查
LINQ语句写法        扩展方法

没有条件                    查询所有         var query = from p in context.Info select p;
有条件
                  单
                               等 值              var query = from p in context.Info where p.Nation == "n001" select p;      
                               不等值            var query = from p in context.Info where p.Birthday < new DateTime(1990, 01, 01) select p;
                  多
                               与 或              var query = from p in context.Info where p.Nation == "n001" && p.Sex==true select p;
                  模糊
                               以..开头
                                          StartsWiths       var query = from p in context.Work where p.Firm.StartsWith("中国") select p;
                              以..结尾
                                          EndsWiths         var query = from p in context.Work where p.Firm.EndsWith("行") select p;
                              包含..
                                          Contains()         var query = from p in context.Work where p.Firm.Contains("内蒙") select p;
                              指定位置是...
                                          Substring(...) == "值"     var query = from p in context.Work where p.Firm.Substring(1, 1) == "国" select p;
                              var query = from p in context.Work where p.Firm.StartsWith("中国") && p.Firm.EndsWith("行") select p;
    链接查询和子查询有语法,但很少写。
        直接可使用对象之间的关系对象进行操作,Linq会自动为我们生成出相应的连接语句或子查询语句。

       var query=from p in context.Info where p.Nation1.Name=="汉族" select p;

排序:
    orderby 属性名 升序                          var query = from p in context.Work orderby p.StartDate select p;
    orderby 属性名 descending 降序         var query = from p in context.Work orderby p.StartDate descending select p;

    扩展方法:
    OrderBy()
    OrderByDescending()

统计函数。
    把LinQ语句括起来,调用相应的方法即可
    Count()                                            var query = (from p in context.Info select p).Count();
    Sum(p=>p.属性名)
    Average(p=>p.属性名)
    Max(p=>p.属性名)
    Min(p=>p.属性名)

取集合第一个对象。
    First()                                             query.first();


分页查询:
    skip(要跳过的条数).take(要取出来的条件)      var query = (from p in context.Work select p).Skip(6).Take(3);

语句还可以这么写:

var query = context.Info.Where(p => p.Nation1.Name == "汉族").Where(p => p.Sex == false);

var query = context.Info.Where(p => p.Nation1.Name == "汉族" && p.Sex == false);

var query = context.Info.OrderBy(p=>p.Birthday);

var query = context.Info.OrderByDescending(p => p.Birthday);

var query = context.Info.Max(p => p.Birthday);


集合操作:交、并、差
        var q1 = context.Info.Where(p => p.Nation != "n001");
        var q2 = context.Info.Where(p => p.Sex == true);

交集:var query = q1.Intersect(q2);
并集:var query = q1.Union(q2);
差集:var query = q1.Except(q2);

 

练习:

public partial class Default4 : System.Web.UI.Page
{
    private const int PageSize = 3;//定义一个常量,每页显示的数量
    private MYDBDataContext _context = new MYDBDataContext();
    //填充分页的下拉列表下拉列表
    private void FillPage()
    { 
         //获取总页数
        int RowsCount = _context.Car.Count();//综行数
        int PageCount = Convert.ToInt32(Math.Ceiling(1.0*RowsCount/PageSize));
        //填充下拉列表
        for (int i = 0; i < PageCount; i++)
        {
            ListItem li = new ListItem((i + 1).ToString(), i.ToString());
            ddlPage.Items.Add(li);
        }
    }
    //显示指定页的汽车数据
    private void ShowCar()
    {
        var query = _context.Car.Skip(PageSize * Convert.ToInt32(ddlPage.SelectedValue)).Take(PageSize);
        Repeater1.DataSource = query;
        Repeater1.DataBind();

        //显示的页数
        lblall.Text = ddlPage.Items.Count.ToString();
        lbl.Text = ddlPage.SelectedItem.Text;
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            FillPage();
            ShowCar();
        }
    }
    //下拉列表
    protected void ddlPage_SelectedIndexChanged(object sender, EventArgs e)
    {
        ShowCar();
    }
    //首页
    protected void btnfirst_Click(object sender, EventArgs e)
    {
        ddlPage.SelectedIndex = 0;
        ShowCar();
    }
    //尾页
    protected void btnend_Click(object sender, EventArgs e)
    {
        //ddlPage.SelectedIndex = Convert.ToInt32(1.0 * _context.Car.Count() / PageSize) - 1;
        ddlPage.SelectedIndex = ddlPage.Items.Count - 1;
        ShowCar();
    }
    //上一页
    protected void btnprev_Click(object sender, EventArgs e)
    {
        if (ddlPage.SelectedIndex<=0)
        {
            ShowCar();
            btnprev.Enabled = false;
        }
        if (ddlPage.SelectedIndex>0)
        {
            ddlPage.SelectedIndex--;
            ShowCar();

            btnprev.Enabled = true;
        }
        
    }
    //下一页
    protected void btnnext_Click(object sender, EventArgs e)
    {
        if (ddlPage.SelectedIndex<ddlPage.Items.Count-1)
        {
            ddlPage.SelectedIndex++;
            ShowCar();
        }
    }
}

 

1.造一个界面:

<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style type="text/css">
        #tbinfo
        {
            background-color:navy;
        }
        .ithead
        {
            color:white;
            font-weight:bold;
            text-align:center;
            font-family:微软雅黑;
        }
        .ititem
        {
            background-color:#ffd800;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:Repeater ID="Repeater1" runat="server">
            <HeaderTemplate>
                <table width="100%" border="0" cellpadding="5" cellspacing="1" id="tbinfo">
                    <tr class="ithead">
                        <td width="5%">代号</td>
                        <td width="10%">姓名</td>
                        <td width="5%">性别</td>
                        <td width="5%">民族</td>
                        <td width="15%">生日</td>
                        <td width="25%">单位</td>
                        <td width="10%">部门</td>
                        <td width="10%">父亲</td>
                        <td width="10%">母亲</td>
                        <td width="5%">配偶</td>
                    </tr> 
            </HeaderTemplate>
            <ItemTemplate>
                    <tr class="ititem">
                        <td><%# Eval("Code") %></td>
                        <td><%# Eval("Name") %></td>
                        <td><%# Eval("Sexname") %></td>
                        <td><%# Eval("Nationname") %></td>
                        <td><%# Eval("Birthday","{0:yyyy年MM月dd日}") %></td>
                        <td><%# Eval("firm") %></td>
                        <td><%# Eval("depart") %></td>
                        <td><%# Eval("father") %></td>
                        <td><%# Eval("mother") %></td>
                        <td><%# Eval("couple") %></td>
                    </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table>
            </FooterTemplate>
        </asp:Repeater>
    
    </div>
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </form>
</body>

2.造一个info类(部分):方便直接调用属性

public partial class Info
{
    public string Sexname
    {
        get 
        {
            return Sex.Value == true ? "男" : "女";
        }
    }
    public string Nationname
    {
        get 
        {
            return Nation1.Name;
        }
    }
    public string firm
    {
        get
        {
            if (this.Work.Count>0)
            {
               Work data= Work.OrderByDescending(p => p.Orders).First();
               return data.Firm;
            }
            else
            {
                return "无";
            }
        }
    }
    public string depart
    {
        get
        {
            if (this.Work.Count>0)
            {
                Work data = this.Work.OrderByDescending(p => p.Orders).First();
                return data.Depart;
            }
            else
            {
                return "无";
            }
        }
    }
    public string father
    {
        get
        {
            if (this.Family.Count > 0)//家庭关系存在
            {
                var query = this.Family.Where(p => p.Title == "T001");
                if (query.Count() > 0)//有父亲这项填了
                {
                    return query.First().Name;
                }
                else
                {
                    return "空";
                }
            }
            else
            {
                return "无";
            }
        }
    }
    public string mother
    {
        get
        {
            if (this.Family.Count>0)
            {
                var query = this.Family.Where(p=>p.Title=="T002");
                if (query.Count()>0)
                {
                    return query.First().Name;
                }
                else
                {
                    return "空";
                }
            }
            else
            {
                return "无";
            }
        }
    }
    public string couple
    {
        get
        {
            if (this.Family.Count>0)
            {
                var query = this.Family.Where(p=>p.Title=="T003");
                if (query.Count()>0)
                {
                    return query.First().Name;
                }
                else
                {
                    return "空";
                }
            }
            else
            {
                return "无";
            }
        }
    }
}

 3.主页:绑定数据

 private MYDBDataContext _Context = new MYDBDataContext();
    private void ShowInfo()
    {
        Repeater1.DataSource = _Context.Info;
        Repeater1.DataBind();
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ShowInfo();
        }
    }

 

转载于:https://www.cnblogs.com/likaixuan/p/4548262.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值