LINQ_to_SQL语法及实例大全 学习.NET必备! 不全不要分。 网上查找LinQ to SQL资料,总是只言片语的,为此,本人话费1天多的时间,编辑、整理了这篇文档,内容都来自网络,为的是给学习.net的同行一点小小的帮助。 学习.NET必备! 不全不要分 ### C#中的LINQ to SQL详解 #### 一、LINQ to SQL简介 **LINQ to SQL** 是 Microsoft .NET Framework 的一部分,它提供了一种简单的方法来将数据库中的数据映射到 C# 对象中,并允许开发人员使用 LINQ(Language Integrated Query)语法来查询这些对象。LINQ to SQL 自动处理了数据访问层和业务逻辑层之间的转换,使得开发人员可以更加专注于应用程序的逻辑而无需过多关注底层的数据访问细节。 #### 二、LINQ to SQL语句详解 ##### 1. Where操作 - **简单形式**:`var result = from p in db.Products where p.UnitPrice > 5 select p;` - 这里`db.Products`是一个包含所有产品的集合,`p.UnitPrice > 5`是过滤条件,表示选择那些单价超过5的产品。 - **关系条件形式**:`var result = from p in db.Products where p.SupplierID == s.ID select p;` - 此处通过供应商ID来筛选产品。 - **First()形式**:`var product = (from p in db.Products where p.ProductName == "Chai" select p).First();` - 使用`First()`方法获取第一个满足条件的对象。 ##### 2. Select/Distinct - **简单用法**:`var names = from p in db.Products select p.ProductName;` - 从产品集合中选择产品名称。 - **匿名类型形式**:`var query = from p in db.Products select new { Name = p.ProductName, Price = p.UnitPrice };` - 创建一个新的匿名类型,其中包含产品名称和单价。 - **条件形式**:`var query = from p in db.Products where p.UnitPrice > 10 select new { Name = p.ProductName, Price = p.UnitPrice };` - 在选择之前添加了一个条件过滤器。 - **指定类型形式**:`var query = from p in db.Products select new ProductViewModel { Name = p.ProductName, Price = p.UnitPrice };` - 将查询结果映射到特定类型的对象。 - **筛选形式**:`var query = from p in db.Products where p.UnitPrice > 10 select new ProductViewModel { Name = p.ProductName, Price = p.UnitPrice };` - 类似于条件形式,但在这里明确指定了结果对象的类型。 - **shaped形式(整形类型)**:`var query = from p in db.Products where p.UnitPrice > 10 select new { ID = p.ProductID, Name = p.ProductName };` - 选择整形ID和字符串名称。 - **嵌套类型形式**:`var query = from p in db.Products where p.UnitPrice > 10 select new { Name = p.ProductName, Supplier = p.Supplier.CompanyName };` - 选择产品名称和供应商公司名称。 - **本地方法调用形式(LocalMethodCall)**:`var query = from p in db.Products where p.UnitPrice > 10 select new { Name = p.ProductName, Price = CustomMath.Round(p.UnitPrice) };` - 在查询中使用自定义方法对单价进行四舍五入处理。 - **Distinct形式**:`var distinctNames = from p in db.Products select p.ProductName; var uniqueNames = distinctNames.Distinct();` - 选择所有不重复的产品名称。 ##### 3. Count/Sum/Min/Max/Avg - **简单形式**:`var count = db.Products.Count();` - 计算所有产品的数量。 - **带条件形式**:`var count = db.Products.Count(p => p.UnitPrice > 10);` - 计算单价大于10的产品数量。 - **Sum形式**:`var total = db.Products.Sum(p => p.UnitPrice);` - 计算所有产品的总价。 - **Min形式**:`var minPrice = db.Products.Min(p => p.UnitPrice);` - 找出所有产品的最低单价。 - **Max形式**:`var maxPrice = db.Products.Max(p => p.UnitPrice);` - 找出所有产品的最高单价。 - **Avg形式**:`var averagePrice = db.Products.Average(p => p.UnitPrice);` - 计算所有产品的平均单价。 ##### 4. Join - **一对多关系(1toMany)**:`var query = from p in db.Products join s in db.Suppliers on p.SupplierID equals s.ID select new { Product = p.ProductName, Supplier = s.CompanyName };` - 连接产品表和供应商表,基于供应商ID进行匹配。 - **多对多关系(ManytoMany)**:`var query = from p in db.Products join c in db.Categories on p.CategoryID equals c.ID select new { Product = p.ProductName, Category = c.CategoryName };` - 连接产品表和类别表,基于类别ID进行匹配。 - **自联接关系**:`var query = from p1 in db.Products join p2 in db.Products on p1.SupplierID equals p2.SupplierID select new { Product1 = p1.ProductName, Product2 = p2.ProductName };` - 在同一表内进行联接。 ##### 5. OrderBy - **简单形式**:`var sortedProducts = from p in db.Products orderby p.ProductName select p;` - 按产品名称升序排序。 - **带条件形式**:`var sortedProducts = from p in db.Products where p.UnitPrice > 10 orderby p.ProductName select p;` - 先过滤后排序。 - **降序排序**:`var sortedProducts = from p in db.Products orderby p.ProductName descending select p;` - 按产品名称降序排序。 - **ThenBy**:`var sortedProducts = from p in db.Products orderby p.UnitPrice, p.ProductName select p;` - 首先按单价排序,然后在相同单价的产品中按产品名称排序。 - **ThenByDescending**:`var sortedProducts = from p in db.Products orderby p.UnitPrice descending, p.ProductName descending select p;` - 首先按单价降序排序,然后在相同单价的产品中按产品名称降序排序。 - **带GroupBy形式**:`var groupedProducts = from p in db.Products group p by p.CategoryID into g orderby g.Key select g;` - 按类别ID分组并排序。 ##### 6. GroupBy/Having - **简单形式**:`var groupedProducts = from p in db.Products group p by p.CategoryID into g select g;` - 按类别ID分组。 - **Select匿名类**:`var groupedProducts = from p in db.Products group p by p.CategoryID into g select new { CategoryID = g.Key, Count = g.Count() };` - 分组后选择匿名类。 - **最大值**:`var groupedProducts = from p in db.Products group p by p.CategoryID into g select new { CategoryID = g.Key, MaxPrice = g.Max(p => p.UnitPrice) };` - 每个组的最大价格。 - **最小值**:`var groupedProducts = from p in db.Products group p by p.CategoryID into g select new { CategoryID = g.Key, MinPrice = g.Min(p => p.UnitPrice) };` - 每个组的最小价格。 - **平均值**:`var groupedProducts = from p in db.Products group p by p.CategoryID into g select new { CategoryID = g.Key, AveragePrice = g.Average(p => p.UnitPrice) };` - 每个组的平均价格。 - **求和**:`var groupedProducts = from p in db.Products group p by p.CategoryID into g select new { CategoryID = g.Key, TotalPrice = g.Sum(p => p.UnitPrice) };` - 每个组的价格总和。 - **计数**:`var groupedProducts = from p in db.Products group p by p.CategoryID into g select new { CategoryID = g.Key, ProductCount = g.Count() };` - 每个组的产品数量。 - **带条件计数**:`var groupedProducts = from p in db.Products group p by p.CategoryID into g select new { CategoryID = g.Key, ProductCount = g.Count(p => p.UnitPrice > 10) };` - 每个组单价大于10的产品数量。 - **Where限制**:`var groupedProducts = from p in db.Products group p by p.CategoryID into g where g.Key == 1 select g;` - 仅选择特定类别的分组。 - **多列(MultipleColumns)**:`var groupedProducts = from p in db.Products group p by new { p.CategoryID, p.SupplierID } into g select g;` - 基于多个列进行分组。 - **表达式(Expression)**:`var groupedProducts = from p in db.Products group p by Expression.Constant(p.CategoryID) into g select g;` - 使用表达式进行分组。 ##### 7. Exists/In/Any/All/Contains - **Any**: - **简单形式**:`bool anyProduct = db.Products.Any();` - 检查是否有任何产品存在。 - **带条件形式**:`bool anyProduct = db.Products.Any(p => p.UnitPrice > 10);` - 检查是否存在单价大于10的产品。 - **All**:`bool allProducts = db.Products.All(p => p.UnitPrice > 0);` - 检查所有产品的单价是否大于0。 - **Contains**: - **包含一个对象**:`bool containsProduct = db.Products.Contains(new Product { ProductID = 1 });` - 检查产品集中是否包含特定产品。 - **包含多个值**:`bool containsProducts = db.Products.Any(p => new int[] { 1, 2, 3 }.Contains(p.ProductID));` - 检查产品集中是否包含具有指定ID的产品。 ##### 8. Concat/Union/Intersect/Except - **Concat(连接)**:`var combinedProducts = db.Products.Concat(db.Suppliers);` - 将两个集合合并为一个。 - **Union(合并)**:`var combinedProducts = db.Products.Union(db.Suppliers);` - 合并两个集合,去除重复项。 - **Intersect(相交)**:`var commonProducts = db.Products.Intersect(db.Suppliers);` - 找出两个集合中的共同项。 - **Except(与非)**:`var productsOnly = db.Products.Except(db.Suppliers);` - 找出在第一个集合中但不在第二个集合中的项。 ##### 9. Top/Bottom和Paging和SqlMethods - **Top/Bottom操作** - **Take**:`var topTenProducts = db.Products.Take(10);` - 获取前10个产品。 - **Skip**:`var skipTenProducts = db.Products.Skip(10);` - 跳过前10个产品。 - **TakeWhile**:`var takeWhileProducts = db.Products.TakeWhile(p => p.UnitPrice < 20);` - 获取所有单价小于20的产品。 - **SkipWhile**:`var skipWhileProducts = db.Products.SkipWhile(p => p.UnitPrice < 20);` - 跳过所有单价小于20的产品。 - **Paging(分页)操作** - **索引**:`var pageTenProducts = db.Products.Skip(10 * (page - 1)).Take(10);` - 获取第page页的10个产品。 - **按唯一键排序**:`var pageTenProducts = db.Products.OrderBy(p => p.ProductID).Skip(10 * (page - 1)).Take(10);` - 按产品ID排序后获取第page页的10个产品。 - **SqlMethods操作** - **Like**:`var likeProducts = db.Products.Where(p => SqlMethods.Like(p.ProductName, "%a%"));` - 搜索产品名称中包含字母"a"的产品。 ##### 10. 已编译查询操作(CompiledQuery) - **已编译查询操作**:`var compiledQuery = System.Data.Linq.DataContext.CompiledQuery.Compile(() => db.Products.Where(p => p.UnitPrice > 10));` - 编译查询以提高性能。 ##### 11. Insert/Update/Delete - **Insert**: - **简单形式**:`db.Products.InsertOnSubmit(new Product { ProductName = "New Product", UnitPrice = 20 });` - 插入新产品。 - **一对多关系**:`db.Products.InsertOnSubmit(new Product { ProductName = "New Product", Supplier = supplier });` - 插入新产品并关联供应商。 - **多对多关系**:`db.ProductCategories.InsertOnSubmit(new ProductCategory { Product = product, Category = category });` - 插入新产品和类别之间的关联。 - **使用动态CUD重写**:`db.DynamicCUD.InsertOnSubmit(new Product { ProductName = "New Product", UnitPrice = 20 });` - 使用动态CUD方法插入新产品。 - **Update**: - **简单形式**:`var productToUpdate = db.Products.First(p => p.ProductID == 1); productToUpdate.UnitPrice = 30; db.SubmitChanges();` - 更新产品的单价。 - **多项更改**:`var productToUpdate = db.Products.First(p => p.ProductID == 1); productToUpdate.UnitPrice = 30; productToUpdate.Discontinued = true; db.SubmitChanges();` - 更新产品的单价和下架状态。 - **Delete**: - **简单形式**:`var productToDelete = db.Products.First(p => p.ProductID == 1); db.Products.DeleteOnSubmit(productToDelete);` - 删除产品。 - **一对多关系**:`var productToDelete = db.Products.First(p => p.ProductID == 1); db.Products.DeleteOnSubmit(productToDelete);` - 删除产品及其相关联的供应商。 - **推理删除**:`db.Products.DeleteOnSubmit(product, true);` - 删除产品并自动删除相关联的对象。 - **使用Attach更新**: - **更新**:`var productToUpdate = new Product { ProductID = 1, UnitPrice = 30 }; db.Products.Attach(productToUpdate); db.SubmitChanges();` - 更新产品单价。 ##### 12. 开放式并发控制和事务 - **开放式并发控制** - **隐式**:`db.Products.Attach(product, false);` - 附着产品时不检查数据库版本。 - **显式**:`db.Products.Attach(product, true);` - 附着产品时检查数据库版本。 - **事务** - 在处理数据库操作时使用事务可以确保数据的一致性和完整性。 以上是关于LINQ to SQL的一些常用操作的详细介绍,通过这些示例,你可以更深入地理解如何使用LINQ to SQL进行数据查询和操作。
剩余105页未读,继续阅读
- 粉丝: 52
- 资源: 62
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 微信自动发送消息,微信机器人(简单),可以给一个特定的人发送一个特定的消息,后续会继续完善的.zip
- 以下是关于Python项目设计资源的详细内容.docx
- 三菱plc基于mx组件的通用访问远程api接口
- 一套基于 .NET 开发的支付SDK,它简化了API调用及通知的处理流程
- 以下是关于使用各种编程语言实现算法的详细学习资源.docx
- e刚发的如果看你的了啊好吧耳鼻喉热交换包括aelh
- kernel-5.15-ky10-x86.tar.gz
- yolov4 - tiny 900张图片训练效果2
- 基于OpenCV的简易实时人脸识别门禁控制系统
- 以下是 YOLO(You Only Look Once)学习的详细课程.docx