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();

        }

    }

 

你可能感兴趣的:(LINQ)