EF Linq To Sql 常用查询整理_常用使用方式整理
EF Linq To Sql 常用查询整理_常用使用方式整理
此处案例使用的.net 5.0框架, EntityFrameworkCore的代码,多数使用场景跟.net framework中相同。
使用到的命名空间
using System.Linq; // Linq
using System.Collections.Generic; //List
using Microsoft.EntityFrameworkCore; // Include()
常用的查询方式整理如下:
一、查询 和 多条件查询
1.根据主键查询 Find()
此方式,性能高,执行查询先从内存中找,然后去数据库找。
//1.根据主键查询
//Find()
Course couse1 = _context.Courses.Find(1);
2.获取对象,获取第一个,最后一个
FirstOrDefault() ,获取第一个没有返回 null,不报错
LastOrDefault()
//2.获取对象,获取第一个,最后一个,
//FirstOrDefault()
//LastOrDefault()
Course couse2 = _context.Courses.Where(q => q.CourseId == 5).FirstOrDefault();
Course couse3 = _context.Courses.Where(q => q.CourseId == 5).LastOrDefault();
3. 获取列表 ToList()
//3.获取列表
//ToList()
List<Course> list1 = _context.Courses.Where(q => q.AddTime > DateTime.Now)
.ToList();
//4.获取部分列表
//Select()
object objList = _context.Courses.Select(q => new
{
q.CourseId,
q.Title
}).ToList();
二、多条件查询和判断
1.Where() + 条件运算符 && || > <
2.Any() : 判断是否存在
3.Contains : 判断含有的数据 对应数据库 的 In 查询
//and
List<Course> list2 = _context.Courses.Where(q => q.AddTime < DateTime.Now && q.Title.Contains("日本语")).ToList();
//or
List<Course> list3 = _context.Courses.Where(q => q.CourseId < 100 || q.Title.Contains("日本语")).ToList();
//any
List<Course> list4 = _context.Courses.Where(q => q.CourseClassList.Any(i => i.ClassId == 3)).ToList();
三、查询关联表数据
EF Core 中默认查询不带关联表数据,提高性能。如果有需要的使用Include() 导入。
//Include()
//关联字段
Course course4 = _context.Courses.Include(q => q.CourseClassList).Where(q => q.CourseId == 3).FirstOrDefault();
int[] classidList = new[] { 3, 4 };
List<Course> list5 = _context.Courses.Where(q => q.CourseClassList.Any(i => classidList.Contains(i.ClassId))).ToList();
四、模糊查询
Contains() 、 StartWidth() 、 EndWidth()
更多参考:https://blog.csdn.net/u011127019/article/details/78469246
//Contains() 、 StartWidth() 、 EndWidth()
List<Course> list6 = _context.Courses.Where(q => q.Title.StartsWith("标准")).ToList();
五、聚合查询
1.Count() :求数量
2.Sum():求和
3.Distinct() : 去重复
4.Max() :求最大值
5.Min():求最小值
6.DefaultIfEmpty() : 对于可为空的表,忽略 null 统计
int count = _context.Courses.Where(q => q.Title.StartsWith("标准")).Count();
int snum = _context.Courses.Where(q => q.CourseClassList.Any(i => i.ClassId == 4)).Select(q => q.ViewCount)
.Sum();
六、排序处理
1.OrderBy() :第一排序,正序
2.OrderByDescending():第一排序,倒序
3.ThenBy():更多排序,正序
4.ThenByDescending():更多排序,倒序
List<Course> list7 = _context.Courses.OrderByDescending(q => q.AddTime)
.ThenByDescending(q => q.ViewCount)
.ToList();
七、分页查询
注释:分页之前,必须排序处理
1.Skip() :划过个数
2.Take(): 获取个数
List<Course> list8 = _context.Courses.OrderByDescending(q => q.AddTime)
.ThenByDescending(q => q.ViewCount)
.Skip(0)
.Take(10)
.ToList();
八、分组查询
1.GroupBy() :单列分组,多列分组
var group1 = _context.Courses.GroupBy(q => q.AddUserId).ToList();
foreach (var group in group1)
{
//group.Key //分组数据
//group.Count(); //当前组数量
}
var group2 = _context.Courses.GroupBy(q => new { q.AddUserId,q.UpdateUserId}).ToList();
更多:
EF And 和Or 条件拼接扩展整理
关于EF上线文异常问题整理
EF GroupBy多个字段
EF中Sum()异常:到值类型“System.Decimal”的强制转换失败,因为具体化值为 null。