本文最后更新于843 天前,其中的信息可能已经过时,如有错误请发送邮件到2192492965@qq.com
- 增加数据:
// 创建模型对象
var user = new User { Name = "John" };
// 添加到DbContext中
_dbContext.Users.Add(user);
// 提交到数据库
await _dbContext.SaveChangesAsync();
- 删除数据:
// 查询对象
var user = await _dbContext.Users.FirstAsync(u => u.Id == 1);
// 从DbContext中移除
_dbContext.Users.Remove(user);
// 提交到数据库
await _dbContext.SaveChangesAsync();
- 修改数据:
// 查询对象
var user = await _dbContext.Users.FirstAsync(u => u.Id == 1);
// 修改属性
user.Name = "Sam";
// 提交更改
await _dbContext.SaveChangesAsync();
- 查询数据:
// 查询所有
var users = await _dbContext.Users.ToListAsync();
// 条件查询
var user = await _dbContext.Users.FirstOrDefaultAsync(u => u.Name == "Tom");
模糊查询
在Entity Framework Core中可以通过以下几种方式实现模糊查询:
- 在SQL查询中使用LIKE和通配符:
var results = context.Users.FromSqlRaw("SELECT * FROM Users WHERE Name LIKE {0}", $"%{searchTerm}%");
- 使用EF.Functions.Like()方法:
var results = context.Users.Where(u => EF.Functions.Like(u.Name, $"%{searchTerm}%"));
- 使用字符串方法Contains/StartsWith/EndsWith:
var results = context.Users.Where(u => u.Name.Contains(searchTerm));
var results = context.Users.Where(u => u.Name.StartsWith(searchTerm));
var results = context.Users.Where(u => u.Name.EndsWith(searchTerm));
- 利用正则表达式实现模糊查询:
var results = context.Users.Where(u => Regex.IsMatch(u.Name, $"{searchTerm}"));
- 使用全文索引实现全文搜索:
var results = context.Users.Where(u => u.Name.Matches(searchTerm));
所以主要是使用LIKE、Contains等方法以及正则表达式来实现模糊查询。
根据数据量大小、查询性能要求选择合适的方式。
- 统计查询:
// 统计总数
var total = await _dbContext.Users.CountAsync();
// 统计满足条件的数量
var total = await _dbContext.Users.CountAsync(u => u.Age > 20);
主要是通过DbContext提供的增删改查方法就可以对数据库进行操作。
-
反向查询
-
建立模型之间的导航属性
例如,Post 和 Blog 模型:
public class Post { public int PostId { get; set; } public string Title { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } // 导航属性 } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public ListPosts { get; set; } // 导航属性 } -
通过导航属性进行查询
示例:根据 Blog 查询其相关的 Posts
// 查询Blog var blog = dbContext.Blogs.First(b => b.BlogId == 1); // 通过导航属性反向查询Post var posts = blog.Posts; // 条件过滤 var posts = blog.Posts.Where(p => p.Title.Contains("EF Core"));
-
-
分页查询
在Entity Framework Core 中可以通过以下几种方式实现分页查询:
- Skip()和Take()
// 跳过50条,返回10条 var page1 = context.Users.Skip(50).Take(10); // 跳过100条,返回10条 var page2 = context.Users.Skip(100).Take(10);- Slice()方法
// 从第3页(50条/页),返回10条 var page3 = context.Users.Slice(2, 10);-
使用LINQ的SkipWhile和TakeWhile
-
在SQL中使用ROW_NUMBER实现分页
var page4 = context.Users .FromSqlRaw("WITH PagedData AS (SELECT *, ROW_NUMBER() OVER(ORDER BY Id) AS RowNum FROM Users) SELECT * FROM PagedData WHERE RowNum BETWEEN {0} AND {1}", skip, take);- 使用第三方分页库,如EntityFramework.PagingC
-
分组查询
- GroupBy查询
// 按Category分组 var groups = context.Products.GroupBy(p => p.Category); // 然后可以对组执行操作 foreach(var group in groups) { Console.WriteLine($"{group.Key} has {group.Count()} products."); }- 在Select中使用GroupBy:
var query = context.Products .GroupBy(p => p.Category) .Select(g => new { Category = g.Key, Count = g.Count() });- 哈夫表查询
var results = context.Products .GroupBy(p => p.Category) .SelectMany(g => g.OrderByDescending(p => p.Price).Take(3));- 在SQL中使用GROUP BY
var query = context.Products.FromSqlRaw("SELECT Category, COUNT(*) AS Count FROM Products GROUP BY Category");常用的分组操作包括GroupBy、在Select中子查询、哈夫表等。
如需执行更复杂的业务查询,可以使用FromSqlRaw、SqlQuery等直接运行SQL语句。




