第三十六节:EFCore10.0新增功能和中断性变更

一. 重点

1.  向量数据库的支持 

  比如EFCore10.x 支持谅解QDrant数据库,但个人还是更将倾向直接使用各个DB官方的库。

 

2. 改进了参数化查询(contains)

对于

int[] ids = [1, 2, 3];
var blogs = await context.Blogs.Where(b => ids.Contains(b.Id)).ToListAsync();

EFCore8之前

SELECT [b].[Id], [b].[Name]
FROM [Blogs] AS [b]
WHERE [b].[Id] IN (1, 2, 3)

EFCore8利用了Json的支持

@__ids_0='[1,2,3]'

SELECT [b].[Id], [b].[Name]
FROM [Blogs] AS [b]
WHERE [b].[Id] IN (
    SELECT [i].[value]
    FROM OPENJSON(@__ids_0) WITH ([value] int '$') AS [i]
)

EFCore10为参数化集合引入了新的默认转换模式,其中集合中的每个值都转换为其自己的标量参数:

SELECT [b].[Id], [b].[Name]
FROM [Blogs] AS [b]
WHERE [b].[Id] IN (@ids1, @ids2, @ids3)

 

3. 新增命名查询筛选器

(1) 全局配置,简化软删除、多租户等功能的实现

modelBuilder.Entity<Blog>()
    .HasQueryFilter("SoftDeletionFilter", b => !b.IsDeleted)
    .HasQueryFilter("TenantFilter", b => b.TenantId == tenantId);

(2)  使用的过程中是允许临时禁用全局筛选器的

var allBlogs = await context.Blogs.IgnoreQueryFilters(["SoftDeletionFilter"]).ToListAsync();

 

4. ExecuteUpdateAsync接受非常规的lambda【重点】

 手动创建表达式树非常复杂且容易出错,并且使此常见方案比应该的要困难得多。 从 EF 10 开始,现在可以改为编写以下代码:

await context.Blogs.ExecuteUpdateAsync(s =>
{
    s.SetProperty(b => b.Views, 8);
    if (nameChanged)
    {
        s.SetProperty(b => b.Name, "foo");
    }
});

 

 

 

二. 其它 

 

 

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2026-02-08 18:53  Yaopengfei  阅读(80)  评论(0)    收藏  举报