ASP.NET 使用语言集成查询 LINQ进行数据访问

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: ASP.NET 使用语言集成查询 LINQ进行数据访问

1. LINQ基础


1.1. LINQ概述


语言集成查询(LINQ)可以为C#和Visual Basic提供强大的查询功能。LINQ引入了标准的、易于学习的查询和更新数据模式,可以对其技术进行扩展以支持几乎任何类型的数据存储。


LINQ主要支持.NET FreamWork下包含的几种语言,例如C#、VB.NET、F#等等


1.2. LINQ查询


LINQ查询的子句语法与SQL子句的含义几乎一致,主要有如下一些子句


image.png

例如下面C#控制台程序,实现了从数组中查找出长度小于7的字符串并输出


static void Main(string[] args)
{
    // 定义一个字符串数组
    String[] strCourse = new String[] { "ASP.NET", "SQLServer", "WebAPP", "Servlet", "PHP" };
    // 定义查询语句,在字符串数组中找出长度小于7的元素
    IEnumerable<String> selectQuery = from eachCourse in strCourse where eachCourse.Length < 7 select eachCourse;
    // 执行LINQ查询
    foreach (String str in selectQuery){
        Console.WriteLine(str);
    }
}


执行结果为:


0a2653c851af460fa595bd959398a8f1.png


1.3. 使用var创建隐性局部变量


在C#中声明变量时,可以不明确指定其数据类型,而使用关键字var来声明。var关键字用来创建隐型局部变量,它指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型、.NET Framework类库中定义的类型或任何表达式。


例如下面C#控制台程序,用var变量来接收LINQ查询到的自定义类型


static void Main(string[] args){
    // 定义一个字符串数组
    String[] strCourse = new String[] { "ASP.NET", "SQLServer", "WebAPP", "Servlet", "PHP" };
    // 定义var变量接收数据
    var changeWord = from word in strCourse select new { Upper = word.ToUpper(), Lower = word.ToLower() };
    // 执行LINQ查询
    foreach (var each in changeWord){
        Console.WriteLine("大写:{0},小写:{1} ", each.Upper, each.Lower);
    }
}


执行结果为:


2d65d23f6d4748949b924e4057485923.png


1.4. Lambda表达式的使用


Lambda表达式是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。所有Lambda表达式都使用Lambda运算符"=>",(读为goes to) 。Lambda运算符的左边是输入参数(如果有),右边包含表达式或语句块。


Lambda表达式的基本语法为:


([输入参数]) => [表达式]


例如,Lambda表达式x => x * x读作x goes to x times X,表示接收一个参数X,返回其值的平方。


又例如下面的C#控制台程序:


static void Main(string[] args){
    string[] strLists = new string[] { "词典", "汉语词典", "汉语词典珍藏版" };
    // 用Lambda表达式查询数组中包含"汉语"两个字的字符串
    // s.IndexOf("汉语")表示查找包含"汉语"的词在数组中的下标
    string[] strList = Array.FindAll(strLists, s => (s.IndexOf("汉语") >= 0));
    foreach (var each in strList){
        Console.WriteLine(each);
    }
}


执行结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


2. LINQ查询表达式


2.1. 获取数据源 from


在LINQ查询中,首先要做的就是指定数据源。像在大多数编程语言中一样,在C#中变量必须先声明才能使用。在LINQ查询中,最先使用from子句的目的是引入数据源和范围变量。


例如下面的语句


// 从tb_stock表获取数据源Info
var queryStock = from Info in tb_stock select Info;


2.2. 数据库操作


2.2.1. 筛选 where


最常用的查询操作是应用布尔表达式形式的筛选器,该筛选器使查询只返回那些表达式结果true的元素。使用where 子句生成结果,实际上,筛选器指定从源序列中排除哪些元素。


也可以使用熟悉的与或运算符来根据需要在where子句中应用任意数量的筛选表达式。


例如下面语句


// 从tb_stock表中筛选name为"电脑",type为"S300"的记录
var query = from Info in tb_stock 
  where Info.name == "电脑" && Info.type == "S300"
  select Info;


2.2.2. 排序 orderby


通常可以很方便地将返回的数据进行排序,orderby 子句将使返回的序列中的元素按照被排序的类型的默认比较器进行排序。


例如下面语句


// 从tb_sell_detailed表中查询qty字段,并降序排列(升序为ascending)
var query = from sellInfo in tb_sell_detailed
  orderby sellInfo.qty descending
  select sellInfo;


2.2.3. 分组 group by


使用group子句可以按指定的键分组结果。


例如下面语句


// 从dataset的V_Salelnfo表中查出数据
var query = from item in dataset.Tables["V_Salelnfo"].AsEnumerable()
// 根据item中的ClientCode进行分组,然后把分组后的数据存放到新的数据表中
group item by item.Field<string>("ClientCode") into g
select new
{
  客户代码 = g.Key,
  客户名称 = g.Max(itm => itm.Fieldstring>("ClientName"),
  销售总额 = g.Sum(itm => itm.Field<double>("Amou),Tosring!("#,##0.00")
};


2.2.4. 联接 join


联接运算可以创建数据源中没有显式建表的序列之间的关联


例如,可以通过执行联接来查找位于同一地点的所有客户和经销商。在LINQ中, join子句始终针对对象集合而非直接针对真实的数据库表。


例如下面的语句


// [表名1] join in [表名2] on [字段名1] equals [字段名2]
// 将表1与表2中字段名相等的记录进行连接,组成新表
var innerJoinQuery = from main in tb_sell_main
join detailed in tb_sell_detailed on main.billcode equals detailed.billcode
select new{
  销售编号 = main.billcode,
  购货单位 = main.units,
  商品编号 = detailed.tradecode,
  商品全称 = detailed.fullname 
};


2.2.5. 选择/投影 select


select子句生成查询结果并指定每个返回的元素的类型。例如,可以指定结果包含的是整个对象,或者是一个成员,或者是成员的子集,或者是基于新对象创建的数据对象(new关键字)。


当select子句生成从源查询出另一个表的操作就称为“投影”


例如:


select new{
  销售编号 = mainbillcode,
  购货单位 = main.units,
  商品编号 = detailed.tradecode,
  商品全称 = detailed.fullname,
  单位 = detailed.unit,
  数量 = detailed.qty,
  单价 = detailed.price,
  金额 = detailed.tsum,
  录单日期 = detailed.bllate
};


3.使用LINQ操作SQL Server数据库


3.1. LINQ查询SQL Server


要使用LINQ查询SQL Server数据库,首先要配置LINQ to SQL类,步骤如下


1、创建LINQ to SQL类

步骤如图所示:

8ec4f2997fb246878c34ecd6d122b7c6.png

如果发现自己的VS里面找不到LINQ to SQL 类,那就打开Visual Studio Installer,点击Modify,点击Individual Components,在Code tools中选中"LINQ to SQL tools"进行安装,安装完成以后重启VS再重复上图步骤就有了


2、配置LINQ to SQL类


首先打开"服务器资源管理器",然后按照下图步骤操作,填写服务器名和数据库名后点击"确定"(身份验证可以是Windows身份验证也可以是SQL Server身份验证):

12c3b7f3f8814309a195c64f051d4445.png

3、创建数据源

创建数据源的方法如图步骤所示

34e8d716411043c08c7ffba9fbba23de.png

完成以上三个步骤创建好了数据源之后,会自动生成一个数据上下文类DataContext,使用DataContext类就可以使用LINQ对SQL Server数据库进行操作了。


一般来说,DataContext类的全名是Linq to SQL类的名字+DataContext,例如本博客设置的Linq to SQL类的名字是默认的DataClasses1.dbml,那么DataContext类的名字就是DataClasses1DataContext


下面的代码实现了把数据源的数据显示到asp页面中:


// .aspx文件
<body>
    <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None">
                <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                <EditRowStyle BackColor="#999999" />
                <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                <SortedAscendingCellStyle BackColor="#E9E7E2" />
                <SortedAscendingHeaderStyle BackColor="#506C8C" />
                <SortedDescendingCellStyle BackColor="#FFFDF8" />
                <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
            </asp:GridView>
        </div>
    </form>
</body>
// .aspx.cs文件
protected void Page_Load(object sender, EventArgs e){
    // ConnectionStrings[""]中的数据源连接字符串可以在packages.config文件的<connectionStrings></connectionStrings>的add标签的name属性中找到,
    // 例如本程序中的数据源连接字符串为db_LibraryMSConnectionString,则可在packages.config文件中的以下语句中找到
    // < connectionStrings >
    // < add name = "db_LibraryMSConnectionString" connectionString = "Data Source=DEITIVOD;Initial Catalog=db_LibraryMS;Integrated Security=True" providerName = "System.Data.SqlClient" />
    // </ connectionStrings >
    DataClasses1DataContext linq = new DataClasses1DataContext(
        System.Configuration.ConfigurationManager.ConnectionStrings["db_LibraryMSConnectionString"].ToString());
  // 查询数据表tb_bookinfo中book_name字段包含"sp"字符串的记录
    var result = from info in linq.tb_bookinfo
        where info.book_name.Contains("sp")
                 select new{
                     图书ID = info.id,
                     图书编号 = info.book_code,
                     图书名称 = info.book_name
                 };
    GridView1.DataSource = result;
    GridView1.DataBind();
}


执行结果如下,可以看到数据很顺利的从展示在asp页面中


0a2653c851af460fa595bd959398a8f1.png


3.2. LINQ操作SQL Server


除查询外,LINQ对SQL Server的操作还有3种,添加、修改和删除,它们分别要用到的方法如下表所示:


image.png


例如下面的代码,实现了向数据表中添加数据的操作:


// .aspx文件
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server" Text="留言标题"></asp:Label>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
        <div>
            <asp:Label ID="Label2" runat="server" Text="E-mail地址"></asp:Label>
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        </div>
        <div>
            <asp:Label ID="Label3" runat="server" Text="留言内容"></asp:Label>
            <asp:TextBox ID="TextBox3" runat="server" TextMode="MultiLine"></asp:TextBox>
        </div>
        <div>
            <asp:Button ID="Button1" runat="server" Text="发表" OnClick="Button1_Click" />
        </div>
    </form>
</body>
// .aspx.cs文件
protected void Page_Load(object sender, EventArgs e){
  DataClasses1DataContext linq = new DataClasses1DataContext(
               System.Configuration.ConfigurationManager.ConnectionStrings["db_LibraryMSConnectionString"].ToString());
    var result = from row in linq.leaveword where row.Id == 0 select row; // 修改id为0的数据
    foreach (leaveword info in result) {
        info.title = ".";
    }
    // 提交修改
    linq.SubmitChanges();
  // 删除记录
    var delete = from row in linq.leaveword where row.Id == 1 select row; // 获取id为1的数据
    linq.leaveword.DeleteAllOnSubmit(delete);
    linq.SubmitChanges();
}
protected void Button1_Click(object sender, EventArgs e){
    DataClasses1DataContext linq = new DataClasses1DataContext(
        System.Configuration.ConfigurationManager.ConnectionStrings["db_LibraryMSConnectionString"].ToString());
    // 数据表对象
    leaveword info = new leaveword();
    // 将TextBox的数据插入数据表中
    info.title = TextBox1.Text;
    info.email = TextBox2.Text;
    info.context = TextBox3.Text;
    // 执行语句
    linq.leaveword.InsertOnSubmit(info);
    linq.SubmitChanges();
    Page.ClientScript.RegisterStartupScript(GetType(), "", "alert('留言成功!');");
}


执行结果如图所示:

2d65d23f6d4748949b924e4057485923.png

此时在数据表leaveword中,可以看到已经添加了刚刚输入的数据


6de278e6d6694ce5bb08e7e842b7e74b.png


在第二次运行程序时,因为有id为0的记录,因此将其title修改成了".",如图所示

8ec4f2997fb246878c34ecd6d122b7c6.png

此时再插入一条数据,ID若为1,则再下次运行程序时会自动删除id为1的记录


3.3. LinqDataSource控件

LinqDataSource是一个数据源绑定控件,通过这个控件可以直接对DataContext对象进行插入、更新、删除操作


LinqDataSource在VS开发环境的工具箱的数据列当中,在代码中加入控件以后,先确定要操作的数据源,在确定要操作的数据表,另外还可以在"高级"选项中选择"自动删除、插入和更新"功能

12c3b7f3f8814309a195c64f051d4445.png

在下面的代码中,就实现了一个具有自动查询、删除、插入和更新功能的LinqDataSource控件:


// .aspx文件
<body>
    <form id="form1" runat="server">
        <div>
            <asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="WebApplication6.DataClasses1DataContext" EnableDelete="True" EnableInsert="True" EnableUpdate="True" EntityTypeName="" TableName="leaveword"></asp:LinqDataSource>
        </div>
        <div>
            <asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="False" DataKeyNames="Id" DataSourceID="LinqDataSource1">
                <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                <Columns>
                    <asp:BoundField DataField="Id" HeaderText="Id" ReadOnly="True" SortExpression="Id" />
                    <asp:BoundField DataField="title" HeaderText="title" SortExpression="title" />
                    <asp:BoundField DataField="email" HeaderText="email" SortExpression="email" />
                    <asp:BoundField DataField="context" HeaderText="context" SortExpression="context" />
                </Columns>
                <EditRowStyle BackColor="#999999" />
                <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                <SortedAscendingCellStyle BackColor="#E9E7E2" />
                <SortedAscendingHeaderStyle BackColor="#506C8C" />
                <SortedDescendingCellStyle BackColor="#FFFDF8" />
                <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
            </asp:GridView>
        </div>
    </form>
</body>


执行结果如下,可以看到,我们没有编写任何操作数据的代码,数据就自动的显示到了相应的数据绑定控件中

0a2653c851af460fa595bd959398a8f1.png

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
API 开发者
【API管理 APIM】APIM集成内部VNet后,自我访问出现(Unable to connect to the remote server)问题,而Remote Server正是APIM它自己
【API管理 APIM】APIM集成内部VNet后,自我访问出现(Unable to connect to the remote server)问题,而Remote Server正是APIM它自己
|
1月前
|
监控 数据安全/隐私保护 异构计算
借助PAI-EAS一键部署ChatGLM,并应用LangChain集成外部数据
【8月更文挑战第8天】借助PAI-EAS一键部署ChatGLM,并应用LangChain集成外部数据
63 1
|
19天前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
36 0
|
1月前
|
JSON 数据管理 关系型数据库
【Dataphin V3.9】颠覆你的数据管理体验!API数据源接入与集成优化,如何让企业轻松驾驭海量异构数据,实现数据价值最大化?全面解析、实战案例、专业指导,带你解锁数据整合新技能!
【8月更文挑战第15天】随着大数据技术的发展,企业对数据处理的需求不断增长。Dataphin V3.9 版本提供更灵活的数据源接入和高效 API 集成能力,支持 MySQL、Oracle、Hive 等多种数据源,增强 RESTful 和 SOAP API 支持,简化外部数据服务集成。例如,可轻松从 RESTful API 获取销售数据并存储分析。此外,Dataphin V3.9 还提供数据同步工具和丰富的数据治理功能,确保数据质量和一致性,助力企业最大化数据价值。
110 1
|
1月前
|
开发框架 .NET 数据库连接
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
|
28天前
|
Java 测试技术 容器
从零到英雄:Struts 2 最佳实践——你的Web应用开发超级变身指南!
【8月更文挑战第31天】《Struts 2 最佳实践:从设计到部署的全流程指南》深入介绍如何利用 Struts 2 框架从项目设计到部署的全流程。从初始化配置到采用 MVC 设计模式,再到性能优化与测试,本书详细讲解了如何构建高效、稳定的 Web 应用。通过最佳实践和代码示例,帮助读者掌握 Struts 2 的核心功能,并确保应用的安全性和可维护性。无论是在项目初期还是后期运维,本书都是不可或缺的参考指南。
32 0
|
28天前
|
SQL 存储 数据管理
掌握SQL Server Integration Services (SSIS)精髓:从零开始构建自动化数据提取、转换与加载(ETL)流程,实现高效数据迁移与集成——轻松上手SSIS打造企业级数据管理利器
【8月更文挑战第31天】SQL Server Integration Services (SSIS) 是 Microsoft 提供的企业级数据集成平台,用于高效完成数据提取、转换和加载(ETL)任务。本文通过简单示例介绍 SSIS 的基本使用方法,包括创建数据包、配置数据源与目标以及自动化执行流程。首先确保安装了 SQL Server Data Tools (SSDT),然后在 Visual Studio 中创建新的 SSIS 项目,通过添加控制流和数据流组件,实现从 CSV 文件到 SQL Server 数据库的数据迁移。
39 0
|
1月前
|
域名解析 网络协议 API
【Azure 应用服务】App Service与APIM同时集成到同一个虚拟网络后,如何通过内网访问内部VNET的APIM呢?
【Azure 应用服务】App Service与APIM同时集成到同一个虚拟网络后,如何通过内网访问内部VNET的APIM呢?
|
1月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
|
21天前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
26 7