如何用Entity Framework Code First编写指定SQL查询的C#代码
用Entity Framework Code First实现你的SQL查询
嘿,作为EF Code First的新手,完全不用慌!我来一步步帮你把这条SQL查询转换成对应的C#实现,让你轻松上手~
首先,我们得先定义对应数据库表的实体类,Code First就是靠这些实体来映射数据库表的:
1. 定义实体类
根据你的SQL里的三个表,我们创建三个实体类,同时要配置好外键和导航属性,这样EF才能识别表之间的关联:
User实体(对应Users表)
public class User { // 主键 public int UserID { get; set; } // 这里可以添加其他用户属性,比如用户名、邮箱等 // 导航属性:一个用户可以有多个管理记录 public ICollection<Management> Managements { get; set; } = new List<Management>(); }
Book实体(对应Books表)
public class Book { // 主键 public int BookID { get; set; } // 对应SQL里的bookName public string BookName { get; set; } // 其他书籍属性,比如作者、价格等 // 导航属性:一本书可以被多个管理记录关联 public ICollection<Management> Managements { get; set; } = new List<Management>(); }
Management实体(对应Managements表)
public class Management { // 主键 public int OrderID { get; set; } // 对应SQL里的BookReturnDate public DateTime BookReturnDate { get; set; } // 对应SQL里的Money public decimal Money { get; set; } // 外键:关联Users表的UserID public int Username_UserID { get; set; } // 外键:关联Books表的BookID public int Book_bookID { get; set; } // 导航属性:一个管理记录属于一个用户 public User User { get; set; } // 导航属性:一个管理记录对应一本书 public Book Book { get; set; } }
如果你的外键命名不符合EF的默认约定(比如默认外键是UserID而不是Username_UserID),可以用DataAnnotations或者Fluent API明确配置关系:
用DataAnnotations配置(在Management类里)
[ForeignKey(nameof(User))] public int Username_UserID { get; set; } [ForeignKey(nameof(Book))] public int Book_bookID { get; set; }
用Fluent API配置(在DbContext的OnModelCreating方法里)
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置Management和User的关联 modelBuilder.Entity<Management>() .HasOne(m => m.User) .WithMany(u => u.Managements) .HasForeignKey(m => m.Username_UserID); // 配置Management和Book的关联 modelBuilder.Entity<Management>() .HasOne(m => m.Book) .WithMany(b => b.Managements) .HasForeignKey(m => m.Book_bookID); }
2. 创建DbContext类
DbContext是EF和数据库交互的核心,我们需要创建一个继承自DbContext的类:
public class LibraryDbContext : DbContext { // 定义对应数据库表的DbSet public DbSet<User> Users { get; set; } public DbSet<Book> Books { get; set; } public DbSet<Management> Managements { get; set; } // 配置数据库连接字符串 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 替换成你的实际数据库连接字符串 optionsBuilder.UseSqlServer("Server=YOUR_SERVER;Database=YOUR_DATABASE;Trusted_Connection=True;"); } }
3. 实现查询逻辑
现在我们可以用LINQ来实现你要的SQL查询了,有几种写法供你选择:
写法1:LINQ查询语法(最接近原生SQL,容易理解)
这种写法和你的原生SQL结构几乎一致,很适合新手:
using (var context = new LibraryDbContext()) { var query = from m in context.Managements join u in context.Users on m.Username_UserID equals u.UserID join b in context.Books on m.Book_bookID equals b.BookID select new { OrderID = m.OrderID, BookName = b.BookName, BookReturnDate = m.BookReturnDate, Money = m.Money }; // 执行查询并获取结果列表 var result = query.ToList(); // 这里可以遍历result处理数据 foreach (var item in result) { Console.WriteLine($"订单ID: {item.OrderID}, 书名: {item.BookName}, 归还日期: {item.BookReturnDate}, 金额: {item.Money}"); } }
写法2:LINQ方法语法(链式调用风格)
如果你喜欢链式调用的写法,可以用这种:
using (var context = new LibraryDbContext()) { var result = context.Managements .Join(context.Users, management => management.Username_UserID, user => user.UserID, (management, user) => new { Management = management, User = user }) .Join(context.Books, combined => combined.Management.Book_bookID, book => book.BookID, (combined, book) => new { combined.Management.OrderID, book.BookName, combined.Management.BookReturnDate, combined.Management.Money }) .ToList(); // 处理结果... }
写法3:利用导航属性(Code First推荐写法)
因为我们已经配置了导航属性,EF会自动帮我们处理表连接,这种写法更简洁,也更符合Code First的设计理念:
using (var context = new LibraryDbContext()) { var result = context.Managements // 如果需要加载关联的User和Book实体(这里查询只需要Book的BookName,其实EF会自动按需加载) // .Include(m => m.User) .Include(m => m.Book) .Select(m => new { m.OrderID, m.Book.BookName, m.BookReturnDate, m.Money }) .ToList(); // 处理结果... }
这样就完成啦!你可以根据自己的习惯选择合适的查询写法,核心是确保实体类和关系配置正确,EF就能帮你生成对应的SQL查询。
内容的提问来源于stack exchange,提问作者Turgay Umudzada
相关产品推荐
相关产品推荐

