SQL语句在EFCore中的简单映射

2024-08-27 15:03:12 浏览数 (4)

在Entity Framework Core (EF Core)中,许多SQL语句的功能可以通过LINQ(Language Integrated Query)查询或EF Core特定的方法来实现。虽然EF Core并不直接映射SQL函数到C#函数,但它提供了丰富的API来执行类似SQL中的操作,如聚合、筛选、排序、连接等。下面是一些常用SQL操作及其在EF Core中的对应实现方式:

SQL操作

EF Core实现

示例

SELECT

LINQ查询

var result = context.Blogs.Select(b => new { b.Id, b.Name }).ToList();

WHERE

LINQ Where

var filtered = context.Blogs.Where(b => b.IsActive).ToList();

ORDER BY

LINQ OrderBy/ThenBy

var ordered = context.Blogs.OrderBy(b => b.Name).ThenBy(b => b.Id).ToList();

GROUP BY

LINQ GroupBy

var grouped = context.Blogs.GroupBy(b => b.Category).Select(g => new { Category = g.Key, Count = g.Count() }).ToList();

HAVING

LINQ Where after GroupBy

var filteredGroups = context.Blogs.GroupBy(b => b.Category).Where(g => g.Count() > 1).Select(g => new { Category = g.Key, Count = g.Count() }).ToList();

JOIN

LINQ Join/GroupJoin

var joined = context.Blogs.Join(context.Posts, b => b.BlogId, p => p.BlogId, (b, p) => new { Blog = b, Post = p }).ToList();

LEFT JOIN

LINQ GroupJoin DefaultIfEmpty

var leftJoined = context.Blogs.GroupJoin(context.Posts, b => b.BlogId, p => p.BlogId, (b, posts) => new { Blog = b, Posts = posts.DefaultIfEmpty() }).SelectMany(x => x.Posts, (b, p) => new { Blog = b.Blog, Post = p }).ToList();

INSERT

DbSet.Add/AddRange

context.Blogs.Add(new Blog { Name = "New Blog" }); context.SaveChanges();

UPDATE

修改实体后SaveChanges

var blog = context.Blogs.Find(1); blog.Name = "Updated Blog"; context.SaveChanges();

DELETE

DbSet.Remove/RemoveRange

var blog = context.Blogs.Find(1); context.Blogs.Remove(blog); context.SaveChanges();

AGGREGATE FUNCTIONS (如 COUNT, MAX, MIN, SUM, AVG)

LINQ Aggregate Functions

var count = context.Blogs.Count(); var maxId = context.Blogs.Max(b => b.Id);

上述示例中的contextDbContext的实例,它是EF Core中用于与数据库交互的主要类。在实际应用中,用户需要根据自己的数据库上下文类名来替换context

对于更复杂的SQL函数,如字符串处理函数、日期时间函数等,EF Core通常不直接提供与SQL函数一一对应的C#函数。但是EF Core 7.0及更高版本引入了EF.Functions类,它提供了一些数据库函数的直接访问,如字符串函数、日期时间函数等。但请注意,这些函数的可用性取决于底层数据库提供程序的支持。

对于EF Core无法直接翻译或处理的复杂SQL查询,可以使用FromSqlRawFromSqlInterpolated方法执行原始SQL查询,并将结果映射到实体或DTO(数据传输对象)上。

0 人点赞