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

ASP.NET MVC中如何用Entity Framework实现无SqlQuery的内连接

改用EF Join方法替代原生SqlQuery实现内连接

别担心,我来一步步教你把这段原生SQL转换成EF的Join写法,其实没你想的那么复杂~首先先拆解你原来的原生SQL逻辑,这样我们能精准对应到EF的写法上:

  • 内连BlogClasses(别名bc)和CategoriesClasses(别名cc),关联条件是bc.category = cc.id
  • 筛选出cc.category等于替换下划线为空格的id参数的记录
  • 按bc.date降序排序
  • 返回指定的几个字段

接下来我们一步步来写EF的Join查询:

第一步:先处理参数

先把id的下划线替换逻辑抽出来,代码更清晰,也避免重复编写:

var targetCategory = id.Replace("_", " ");

第二步:使用EF的Join方法构建查询

假设你的dbBlog里有BlogClasses的DbSet(毕竟之前用它来执行SqlQuery),而dbCategories里有CategoriesClasses的DbSet,那么代码可以这么写:

var result = dbBlog.BlogClasses
    // 执行内连接操作
    .Join(
        dbCategories.CategoriesClasses, // 要连接的目标集合(对应SQL里的cc表)
        bc => bc.category, // 主表(BlogClasses)的关联键(对应SQL里的bc.category)
        cc => cc.id, // 关联表(CategoriesClasses)的匹配键(对应SQL里的cc.id)
        // 结果选择器:指定要返回的字段,完全对应你原生SQL的查询列
        (bc, cc) => new 
        {
            Id = bc.id,
            Title = bc.title,
            Post = bc.post,
            Date = bc.date,
            FeaturedImage = bc.featuredImage,
            Category = cc.category
        }
    )
    // 添加筛选条件(对应SQL里的WHERE子句)
    .Where(item => item.Category == targetCategory)
    // 按日期降序排序(对应SQL里的ORDER BY)
    .OrderByDescending(item => item.Date)
    // 转成List集合
    .ToList();

给你拆解下Join的四个核心参数:

  1. 第一个参数:你要连接的另一个数据集,也就是原生SQL里的CategoriesClasses cc
  2. 第二个参数:从主集合(BlogClasses)中选择用来做关联的字段,对应SQL里的bc.category
  3. 第三个参数:从关联集合(CategoriesClasses)中选择匹配的关联字段,对应SQL里的cc.id
  4. 第四个参数:结果选择器,用来定义你最终要返回的数据结构,可以是上面的匿名类型,也可以是你提前定义好的DTO类

额外优化提示:

如果之后你需要把结果绑定到视图,建议定义一个专门的DTO类(比如BlogCategoryDto),把匿名类型换成这个类的实例,这样代码可读性和可维护性更好,示例如下:

// 先定义DTO类
public class BlogCategoryDto
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Post { get; set; }
    public DateTime Date { get; set; }
    public string FeaturedImage { get; set; }
    public string Category { get; set; }
}

// 然后查询里的结果选择器改成:
(bc, cc) => new BlogCategoryDto
{
    Id = bc.id,
    Title = bc.title,
    Post = bc.post,
    Date = bc.date,
    FeaturedImage = bc.featuredImage,
    Category = cc.category
}

这样写出来的查询和你原来的原生SQL逻辑完全一致,而且是纯EF的写法,不需要拼接原生SQL,还能避免SQL注入风险。

内容的提问来源于stack exchange,提问作者user979331

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:13:30