You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:31:55