.NET CORE 2 EF 包括

Posted

技术标签:

【中文标题】.NET CORE 2 EF 包括【英文标题】:.NET CORE 2 EF Include 【发布时间】:2018-05-06 13:29:25 【问题描述】:

我正在使用新的 .net 核心和 EF。

我需要有关 include linq 命令的帮助。我有一些 1:N 模型,如果集合包含一些标记为已删除的数据,我不想包含它们。

怎么做?

var company = await _context.Company
                .Include(y => y.Administrators)
                .Include(y => y.CompanyPartTimers)
                .Include(z => z.WorkPlaces)
                .Include(z => z.Requirements)
                .FirstAsync(x => x.Id == id);

如果我添加条件

.Include(z => z.WorkPlaces).Where(x=>x.WorkPlaces.Where(x=>!x.IsDeleted))

它不起作用。这个怎么写?

接下来我有 IDeletable 接口,如果我有一些自定义 linq 表达式并且可以为 ex 做的话会更好。

.Include(z => z.WorkPlaces).GetNonDeleted()

有人知道怎么做吗? 我尝试过这样的事情

public static class LinqExtension
    
        public static IEnumerable<T> GetActive<T>(this IEnumerable<T> source) where T : class, IDeletable
        
            return source.Where(x => x.IsDeleted);
        
    

谢谢大家。

【问题讨论】:

将 x=>x.WorkPlaces.Where(x=>!x.IsDeleted) 更改为 x=>x.WorkPlaces.Any(x=>!x.IsDeleted) "It doesn't work" 你有错误吗?结果与预期不同? 编译错误 @JardaLanger,你解决了这个问题吗? 是的,我在下面的链接中使用了查询过滤器docs.microsoft.com/en-us/ef/core/querying/filters 【参考方案1】:

您可以在 DbContext 中配置 查询过滤器

modelBuilder.Entity<Administrator>()
            .HasQueryFilter(admin => !EF.Property<boolean>(admin, "IsDeleted"));

应该做的伎俩

参考链接:https://docs.microsoft.com/en-us/ef/core/querying/filters

【讨论】:

【参考方案2】:

您应该使用Any 而不是Where 更改内部条件,如:

.Include(z => z.WorkPlaces)
.Where(x => x.WorkPlaces.Any(y => !y.IsDeleted))

【讨论】:

也适用于非布尔字段,例如:.Where(x => x.WorkPlaces.Any(y => y.Id == 1))

以上是关于.NET CORE 2 EF 包括的主要内容,如果未能解决你的问题,请参考以下文章

Azure Functions .NET Core 中的 EF Core 2.0 连接字符串

powershell EF6 .Net Core 2现有数据库

.NET Core 1.0ASP.NET Core 1.0和EF Core 1.0简介

.NET Core/EF Core 2.0 升级后急切加载“类型之间未定义强制运算符”

sqlite + .net core ef 3

.NET Core 2.0 和 EF 下是不是需要使用 IdentityDbContext 进行 JWT 身份验证?