LINQ在数据库中的应用:LINQ to SQL 和 Entity Framework

在数据库中使用LINQ进行CRUD操作(创建、读取、更新、删除)通常通过Entity FrameworkLINQ to SQL来实现。Entity Framework是一个更现代的ORM(对象关系映射)工具,具有更广泛的功能。因此,我将重点展示如何使用Entity Framework中的LINQ进行CRUD操作。

前置条件:

1.你需要安装Entity Framework(通过NuGet包EntityFramework)。

2.创建一个数据库上下文类和实体类,映射数据库中的表和字段。

Install-Package EntityFramework

步骤

1.引用的命名空间

在你的代码中,确保引入以下命名空间:

using System;
using System.Linq;
using System.Data.Entity;  // 用于Entity Framework
using System.Collections.Generic;

2.配置数据库上下文和实体类

首先需要创建一个数据库上下文类(继承DbContext),该类将管理与数据库的连接和查询。你还需要一个实体类来映射数据库中的表。

// 学生实体类,映射到数据库中的"Students"表
public class Student
{
    public int StudentId { get; set; }  // 主键
    public string Name { get; set; }
    public int Age { get; set; }
}

// 数据库上下文类,包含对数据库表的引用
public class SchoolContext : DbContext
{
    public DbSet<Student> Students { get; set; }  // Students表
}

CRUD操作示例代码

1.Create(创建/插入操作)

通过Add()方法将新的实体对象插入到数据库表中。

using (var context = new SchoolContext())
{
    // 创建一个新的学生对象
    var newStudent = new Student
    {
        Name = "Alice",
        Age = 22
    };

    // 将新学生添加到Students表中
    context.Students.Add(newStudent);

    // 保存更改,将数据写入数据库
    context.SaveChanges();

    Console.WriteLine("New student created: " + newStudent.Name);
}

解释:

•        Add() 方法将新的学生对象添加到上下文的Students集合中。

•        SaveChanges() 将更改保存到数据库中。

2.Read(读取操作)

通过LINQ查询数据库中的数据,可以使用查询表达式或方法语法。

using (var context = new SchoolContext())
{
    // 使用LINQ查询所有学生
    var students = context.Students.ToList();

    // 打印所有学生信息
    foreach (var student in students)
    {
        Console.WriteLine($"StudentId: {student.StudentId}, Name: {student.Name}, Age: {student.Age}");
    }

    // 根据条件查询单个学生
    var singleStudent = context.Students.FirstOrDefault(s => s.Name == "Alice");
    if (singleStudent != null)
    {
        Console.WriteLine($"Found student: {singleStudent.Name}, Age: {singleStudent.Age}");
    }
}

解释:

•        ToList() 方法将查询结果转化为列表。

•        FirstOrDefault() 用于查询满足条件的第一个学生(如果没有符合条件的学生,则返回null)。

3.Update(更新操作)

通过查询并修改实体对象的属性,然后调用SaveChanges()将更改保存到数据库中。

using (var context = new SchoolContext())
{
    // 查找要更新的学生对象
    var studentToUpdate = context.Students.FirstOrDefault(s => s.Name == "Alice");

    if (studentToUpdate != null)
    {
        // 更新学生的年龄
        studentToUpdate.Age = 23;

        // 保存更改到数据库
        context.SaveChanges();

        Console.WriteLine("Student updated: " + studentToUpdate.Name);
    }
    else
    {
        Console.WriteLine("Student not found.");
    }
}

解释:

•        查询学生对象后,修改对象的Age属性,然后调用SaveChanges()将更新保存到数据库中。

4.Delete(删除操作)

通过查询要删除的实体对象,然后使用Remove()方法从上下文中删除该对象,最后调用SaveChanges()来保存删除操作。

using (var context = new SchoolContext())
{
    // 查找要删除的学生对象
    var studentToDelete = context.Students.FirstOrDefault(s => s.Name == "Alice");

    if (studentToDelete != null)
    {
        // 删除该学生对象
        context.Students.Remove(studentToDelete);

        // 保存更改到数据库
        context.SaveChanges();

        Console.WriteLine("Student deleted: " + studentToDelete.Name);
    }
    else
    {
        Console.WriteLine("Student not found.");
    }
}

解释

•        Remove() 方法从上下文中删除学生对象,SaveChanges() 保存删除操作到数据库。

运行CRUD操作的完整代码

以下是上述所有CRUD操作的完整代码示例,使用Entity Framework操作数据库中的Students表:

using System;
using System.Linq;
using System.Data.Entity;
using System.Collections.Generic;

public class Student
{
    public int StudentId { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

public class SchoolContext : DbContext
{
    public DbSet<Student> Students { get; set; }  // 映射Students表
}

public class Program
{
    public static void Main()
    {
        using (var context = new SchoolContext())
        {
            // 1. Create - 插入新的学生数据
            var newStudent = new Student
            {
                Name = "Alice",
                Age = 22
            };
            context.Students.Add(newStudent);
            context.SaveChanges();
            Console.WriteLine("New student created: " + newStudent.Name);

            // 2. Read - 查询所有学生
            var students = context.Students.ToList();
            foreach (var student in students)
            {
                Console.WriteLine($"StudentId: {student.StudentId}, Name: {student.Name}, Age: {student.Age}");
            }

            // 3. Update - 更新学生信息
            var studentToUpdate = context.Students.FirstOrDefault(s => s.Name == "Alice");
            if (studentToUpdate != null)
            {
                studentToUpdate.Age = 23;
                context.SaveChanges();
                Console.WriteLine("Student updated: " + studentToUpdate.Name);
            }

            // 4. Delete - 删除学生
            var studentToDelete = context.Students.FirstOrDefault(s => s.Name == "Alice");
            if (studentToDelete != null)
            {
                context.Students.Remove(studentToDelete);
                context.SaveChanges();
                Console.WriteLine("Student deleted: " + studentToDelete.Name);
            }
        }
    }
}

总结:

•        Create:使用Add()方法向数据库中插入新对象。

•        Read:使用LINQ查询(ToList()FirstOrDefault())从数据库中读取数据。

•        Update:修改实体对象后,调用SaveChanges()保存更新。

•        Delete:使用Remove()删除对象,并调用SaveChanges()保存更改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901770.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pr 视频效果:波形变形

视频效果/扭曲/波形变形 Distort/Wave Warp 波形变形 Wave Warp效果用于在剪辑上创建类似波浪的动态变形效果。 此效果会自动动画化&#xff0c;波形以恒定速度移动。要改变速度或停止波动&#xff0c;需要设置关键帧。 ◆ ◆ ◆ 效果选项说明 通过调整波形的类型、高度、宽度…

(六)问题记录,simulink仿真出现模型碰撞后穿越

明明已经设置了车轮和地面之间的 spatial contact force&#xff0c;可是还会出现模型穿越&#xff08;重力作用下自由落体&#xff09;&#xff0c;如下图所示。 可仅降低小车初始高度后就不会穿越&#xff0c;如下图所示。 初步怀疑是小车初始高度大的话&#xff0c;小车在和…

【原创】统信UOS如何安装最新版Node.js(20.x)

注意直接使用sudo apt install nodejs命令安装十有八九会预装10.x的老旧版本Node.js&#xff0c;如果已经安装的建议删除后安装如下方法重装。 在统信UOS系统中更新Node.js可以通过以下步骤进行&#xff1a; 1. 卸载当前版本的Node.js 首先&#xff0c;如果系统中已经安装了N…

Kafka消费者故障,出现活锁问题如何解决?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka消费者故障&#xff0c;出现活锁问题如何解决&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Kafka消费者故障&#xff0c;出现活锁问题如何解决&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资…

照片怎么转换成pdf?盘点6种图片转pdf格式有效方法,直击要点!

照片怎么转换成pdf&#xff1f;在日常生活和工作中&#xff0c;我们难免会碰到需要将照片以pdf格式保存的情况&#xff0c;以便于更好的整理、分享或打印。虽然jpg格式的图片因其体积小而方便分享&#xff0c;但有时我们也希望将这些图片转换成pdf格式&#xff0c;以便于创建专…

《自动驾驶技术的深度思考:安全与伦理的挑战》

内容概要 在当今这个自动驾驶技术飞速发展的时代&#xff0c;我们生活的节奏恰似一场疾驰的赛车&#xff0c;然而&#xff0c;赛道上并非总是平坦。在这场技术革命中&#xff0c;安全与伦理问题像是潜伏在阴影中的幽灵&#xff0c;轮番考验着我们的道德底线与法律界限。 随着…

圆柱形腔体谐振器理论分析-20241027

圆柱形腔体谐振器 谐振电路在电子工程中起着非常重要的作用。在低频段&#xff0c;谐振电路通常由集总参数的电感和电容构成&#xff0c;即为LC谐振电路&#xff0c;其品质因数通常为数百。当频率升高到微波频段时&#xff0c;电路的尺寸与电磁波的波长可以比拟&#xff0c;集…

微信小程序——消息订阅

首先用到的就是wx.requestSubscribeMessage接口。 注意&#xff1a;用户发生点击行为或者发起支付回调后&#xff0c;才可以调起订阅消息界面 requestSubscribeMessage() {uni.requestSubscribeMessage({tmplIds: [],//需要订阅的消息模板的id的集合&#xff0c;一次调用最多可…

vscode配色主题与图标库推荐

vscode配色主题推荐:Andromedavsocde图标库&#xff1a; vscode-icons Andromeda Dark theme with a taste of the universe 仙女座&#xff1a;一套宇宙深空体验的哑暗色主题; 高对比度,色彩饱和; Easy Installation Open the extensions sidebar on Visual Studio CodeSear…

arm架构 ubuntu 部署docker

如果有旧版本需要卸载 sudo apt remove docker docker-engine docker-ce docker.io 安装依赖包 sudo apt update && apt install -y apt-transport-https ca-certificates curl software-properties-common 添加docker秘钥 阿里云 curl -fsSL http://mirrors.aliyu…

Java应用程序的测试覆盖率之设计与实现(三)-- jacoco cli 客户端

一、背景 上文已把覆盖率数据采集好了,并提供远程连接的tcp地址及端口。 jacoco cli文档jacoco cli jar包jacococli.jar 我下载好了,放在github工程里。 本文主要是介绍如何使用jacoco cli 客户端读取并生成覆盖率报告。 二、使用 1、dump覆盖率统计 java -jar doc/jacoc…

基于java的山区环境监督管理系统(源码+定制+开发)环境数据可视化、环境数据监测、 环境保护管理 、污染防治监测系统 大数据分析

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

双子塔楼宇可视化系统:提升建筑管理与运营效率

利用图扑可视化技术对双子塔楼宇的各项功能进行实时监控和管理。通过数据分析优化资源配置&#xff0c;提高能源效率&#xff0c;增强楼宇安全性&#xff0c;实现智能化运营。

提示工程(Prompt Engineering)指南(进阶篇)

在 Prompt Engineering 的进阶阶段&#xff0c;我们着重关注提示的结构化、复杂任务的分解、反馈循环以及模型的高级特性利用。随着生成式 AI 技术的快速发展&#xff0c;Prompt Engineering 已经从基础的单一指令优化转向了更具系统性的设计思维&#xff0c;并应用于多轮对话、…

在GeoTools中的Shapefile属性表读取效率之Shp与Dbf对比

目录 前言 一、POI测试数据简介 1、选用的POI数据 2、关于数据的属性数据 二、属性数据读取的两种方式实现 1、基于DbaseFileReader的读取 2、基于SimpleFeatureSource的读取 三、实际运行对比 1、内存和CPU占用情况 2、运行耗时情况 四、总结 前言 众所周知&#x…

创建型模式-----建造者模式

目录 背景&#xff1a; 构建模式UML 代码示例 房子成品&#xff1a; 构建器抽象&#xff1a; 具体构建器&#xff1a; 建筑师&#xff1a; 测试部…

从蚂蚁金服面试题窥探STW机制

背景 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;垃圾回收&#xff08;GC&#xff09;是一个至关重要的机制&#xff0c;它负责自动管理内存的分配和释放。然而&#xff0c;垃圾回收过程并非没有代价&#xff0c;其中最为显著的一个影响就是STW&#xff08;Stop-T…

跟着鸟儿学飞行?扑翼机器人的感知秘籍

大家好&#xff01;今天来了解一篇扑翼机器人的研究——《Avian-inspired embodied perception in biohybrid flapping-wing robotics》发表于《Nature Communications》。在广阔天空中&#xff0c;鸟类凭借精妙翅膀结构与敏锐感知自由翱翔&#xff0c;这一直吸引着科学家探索其…

从数据中台到数据飞轮:实现数据驱动的升级之路

从数据中台到数据飞轮&#xff1a;实现数据驱动的升级之路 随着数字化转型的推进&#xff0c;数据已经成为企业最重要的资产之一&#xff0c;企业普遍搭建了数据中台&#xff0c;用于整合、管理和共享数据&#xff1b;然而&#xff0c;近年来&#xff0c;数据中台的风潮逐渐减退…

django(3)jinja2模版的使用

启动模版 安装jinja2 pip install jinja2 配置setting TEMPLATES中添加配置 {BACKEND: django.template.backends.jinja2.Jinja2,DIRS: [os.path.join(BASE_DIR,jinja2)], #模版在项目中的所在位置} template中各项的含义 这个配置项中模版自上而下加载&#xff0c;重名…