.net ef core 检查是不是插入成功

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net ef core 检查是不是插入成功相关的知识,希望对你有一定的参考价值。

参考技术A 可以使用查询语句检查是否插入成功:
目前支持贪婪加载:使用Include加载 关联表 的数据,这种方式 使用一条Join的 Sql语句进行查询;
贪婪加载的优势在于仅执行1次SQL查询即返回所需要的结果。但使用JOIN查询在数据库记录条数较多时,多条简单的SQL查询往往比一条复杂的JOIN查询效率要好。

EF CORE PostgreSQL - 检查列表的所有元素是不是包含在另一个列表中

【中文标题】EF CORE PostgreSQL - 检查列表的所有元素是不是包含在另一个列表中【英文标题】:EF CORE PostgreSQL - Check if ALL elements of a List are contained in another ListEF CORE PostgreSQL - 检查列表的所有元素是否包含在另一个列表中 【发布时间】:2022-01-15 06:20:24 【问题描述】:

我正在寻找一种在实体框架中检查列表的所有元素是否包含在另一个列表中的方法。

我的应用程序是 .NET 6,我使用 Npgsql 查询我的 PostgreSQL 数据库,我有一个 ID 列表和一个与另一个表“Certifications”相关的类“Company”。

公司类如下所示:

    public class Company
    
        public int ID  get; set; 
        public List<Certification> Certifications  get; set; 
        ...
    

我的认证课程看起来像这样:

public class Certification

    public int ID  get; set; 
    public int? CompanyID  get; set; 
    public CertificationType Type  get; set; 

    public int CategoryID  get; set; 
    public virtual Category Category  get; set; 

    public int? RankingID  get; set; 
    public virtual Ranking Ranking  get; set; 
    ...

查询是显示公司的分页查询,它必须在数据库上执行(无客户端查询),我正在尝试使用 LINQ 编写它,但出现以下错误:

LINQ 表达式 'opt => DbSet() .Where(c0 => EF.Property(EntityShaperExpression: ALPHUBs.ML.Models.Company 值缓冲区表达式: ProjectionBindingExpression:EmptyProjectionMember IsNullable: 假 , "ID") != null && object.Equals( objA: (object)EF.Property(EntityShaperExpression: ALPHUBs.ML.Models.Company 值缓冲区表达式: ProjectionBindingExpression:EmptyProjectionMember IsNullable: 假 , “ID”), objB: (object)EF.Property(c0, "CompanyID"))) .Select(c0 => c0.CategoryID) .Any(p => p == opt)' 无法翻译。要么以可翻译的形式重写查询,要么切换到客户评估 通过插入对“AsEnumerable”、“AsAsyncEnumerable”的调用,显式地 “ToList”或“ToListAsync”。看 https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。

我已经尝试过这些方式:

IQueryable<Company> query = this._context.Companies.AsNoTracking()
                                                    .Include(c => c.Certifications)
                                                    .AsSplitQuery();

List<int> categoryList = new List<int>()  1, 3, 5 ;

//ATTEMPT 1
query.Where(c => categoryList.All(opt => c.Certifications.Select(cert => cert.CategoryID).Contains(opt)));
//ATTEMPT 2
query.Where(c => categoryList.Except(c.Certifications.Select(cert => cert.CategoryID)).Count() == 0);

我可以让它工作的唯一方法是:

 c.Certifications.Any(cert => categoryList.Contains(cert.CategoryID));

但这给了我错误的结果,因为我需要拥有所有给定认证的所有公司,而不是至少拥有一个给定认证的公司。

【问题讨论】:

【参考方案1】:

下面的内容怎么样:

var categoryList = new List<int>  1, 3, 5 ;
_ = ctx.Companies
    .Where(c => c.Certifications.Count(c => categoryList.Contains(c.ID)) == categoryList.Count)
    .ToList();

这假设对于给定的公司,最多只有一个具有给定 ID 的认证。

【讨论】:

谢谢你为我节省了大量的调试时间:)

以上是关于.net ef core 检查是不是插入成功的主要内容,如果未能解决你的问题,请参考以下文章

插入到 EF Core ASP.NET Core Razor Pages .NET6 中自动生成的 Bridge 表

如何避免在 EF Core 中插入后选择插入的实体?

如何从另一个表中获取数据并插入到 EF Core 中所需的表中

ef core 子对象集合插入顺序

Dapper for NET Core:插入表并返回插入行的 id

EF Core 错误地为 Array 执行多次插入