普通网友 2025-11-26 18:26 采纳率: 0%
浏览 4

我在.net core项目中使用EF Core,我是Linq和原生SQL一起在使用

我在.net core项目中使用EF Core,我是Linq和原生SQL一起在使用,一般是查询用Linq,还有简单的操作(比如新增一条数据,修改一条数据,删除一条数据)这种也用Linq去操作,然后比较复杂的操作,我是直接写原生SQL在DbContext里面去执行的。这种是否算合理的使用?前天去面试的时候,那个面试官说我这样做违背了ORM的本意,大家是如何使用EF Core的?

  • 写回答

3条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-11-26 18:43
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析
      - 涉及在.NET Core项目中同时运用EF Core的Linq和原生SQL。
      - 对于不同类型的数据库操作(查询、新增、修改、删除)在两种方式间的选择及比较。
    2. 解决方案
      - Linq操作

      • 查询
        ```csharp
        using Microsoft.EntityFrameworkCore;
        using System.Linq;

      public class MyDbContext : DbContext
      {
      public DbSet MyEntities { get; set; }
      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
      optionsBuilder.UseSqlServer(“your_connection_string”);
      }
      }

      public class MyEntity
      {
      public int Id { get; set; }
      public string Name { get; set; }
      }

      public class LinqQueryExample
      {
      public void Query()
      {
      using (var context = new MyDbContext())
      {
      var query = context.MyEntities.Where(e => e.Name.Contains(“some_value”));
      foreach (var entity in query)
      {
      Console.WriteLine(entity.Name);
      }
      }
      }
      }
      - **新增**:csharp
      public class LinqInsertExample
      {
      public void Insert()
      {
      using (var context = new MyDbContext())
      {
      var newEntity = new MyEntity { Name = “New Name” };
      context.MyEntities.Add(newEntity);
      context.SaveChanges();
      }
      }
      }
      - **修改**:csharp
      public class LinqUpdateExample
      {
      public void Update()
      {
      using (var context = new MyDbContext())
      {
      var entityToUpdate = context.MyEntities.FirstOrDefault(e => e.Name == “Old Name”);
      if (entityToUpdate!= null)
      {
      entityToUpdate.Name = “New Name”;
      context.SaveChanges();
      }
      }
      }
      }
      - **删除**:csharp
      public class LinqDeleteExample
      {
      public void Delete()
      {
      using (var context = new MyDbContext())
      {
      var entityToDelete = context.MyEntities.FirstOrDefault(e => e.Name == “Name to Delete”);
      if (entityToDelete!= null)
      {
      context.MyEntities.Remove(entityToDelete);
      context.SaveChanges();
      }
      }
      }
      }
      - **原生SQL操作**: - **查询**:csharp
      public class SqlQueryExample
      {
      public void Query()
      {
      using (var context = new MyDbContext())
      {
      var query = context.MyEntities.FromSqlRaw(“SELECT * FROM MyEntities WHERE Name LIKE ‘%some_value%’“);
      foreach (var entity in query)
      {
      Console.WriteLine(entity.Name);
      }
      }
      }
      }
      - **新增**:csharp
      public class SqlInsertExample
      {
      public void Insert()
      {
      using (var context = new MyDbContext())
      {
      context.Database.ExecuteSqlRaw(“INSERT INTO MyEntities (Name) VALUES (‘New Name’)”);
      context.SaveChanges();
      }
      }
      }
      - **修改**:csharp
      public class SqlUpdateExample
      {
      public void Update()
      {
      using (var context = new MyDbContext())
      {
      context.Database.ExecuteSqlRaw(“UPDATE MyEntities SET Name = ‘New Name’ WHERE Name = ‘Old Name’“);
      context.SaveChanges();
      }
      }
      }
      - **删除**:csharp
      public class SqlDeleteExample
      {
      public void Delete()
      {
      using (var context = new MyDbContext())
      {
      context.Database.ExecuteSqlRaw(“DELETE FROM MyEntities WHERE Name = ‘Name to Delete’“);
      context.SaveChanges();
      }
      }
      }
      ```
      3. 两种方式的优缺点比较
      - Linq优点
      - 强类型安全:基于实体类进行操作,代码可读性高,不易出错。
      - 语法简洁:相比原生SQL,代码量通常较少,开发效率高。
      - 与EF Core集成度高:能充分利用EF Core的功能,如自动跟踪实体状态等。
      - Linq缺点
      - 性能:对于复杂查询,生成的SQL可能不够优化,性能不如精心编写的原生SQL。
      - 原生SQL优点
      - 性能优化:可以编写高度优化的SQL语句,适合处理复杂查询和大数据量场景。
      - 灵活性高:能直接使用数据库特有的功能和语法。
      - 原生SQL缺点
      - 弱类型:容易出现SQL注入等安全问题,需要手动处理参数化。
      - 代码复杂:相比Linq,编写原生SQL代码量较大,且依赖数据库知识。
      4. 总结
      - Linq操作简单、安全且与EF Core集成良好,适合简单的数据库操作。
      - 原生SQL在性能优化和复杂查询场景下更具优势,但使用时需谨慎处理安全问题和编写更复杂的代码。在实际项目中,应根据具体需求权衡选择使用Linq还是原生SQL。

    以上示例基于SQL Server数据库,不同数据库在使用原生SQL时语法会有差异,连接字符串等配置也需相应调整。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月26日