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的四个核心参数:
- 第一个参数:你要连接的另一个数据集,也就是原生SQL里的
CategoriesClasses cc - 第二个参数:从主集合(
BlogClasses)中选择用来做关联的字段,对应SQL里的bc.category - 第三个参数:从关联集合(
CategoriesClasses)中选择匹配的关联字段,对应SQL里的cc.id - 第四个参数:结果选择器,用来定义你最终要返回的数据结构,可以是上面的匿名类型,也可以是你提前定义好的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
相关产品推荐
相关产品推荐

