首先使用EF代码的存储库模式时的Linq子查询

本文关键字:模式 Linq 查询 存储 EF 代码 | 更新日期: 2023-09-27 18:20:12

我目前使用一种通用存储库模式,首先使用实体框架代码:

public interface IRepository<TEntity> where TEntity : class
{
    void Add(TEntity entity);
    void Delete(TEntity entity);
    TEntity GetById(int id);
    IEnumerable<TEntity> GetAll();
}
public interface IUserRepository : IRepository<User>
{
    IEnumerable<User> GetAllWithSubQuery();
}
public interface IBlackListRepository : IRepository<BlackList>
{
}
public interface IUserProccessedRepository : IRepository<UserProcessed>
{
}
public IEnumerable<User> GetAllWithSubQuery()
{
    var result = Database.Set<User>().Where(x => x.UsersProccessed.Any())
                                     .ToList();
    return result;
}

模型设置如下:

modelBuilder.Entity<UserProcessed>().HasRequired(x => x.User)
                                    .WithMany(x => x.UsersProccessed)
                                    .Map(x => x.MapKey("UserId"));

问题是,我想在上面的LINQ中添加一个子查询,这样它就会做类似的事情:

SELECT      u.Email
FROM        Users u INNER JOIN UsersProcessed up ON u.Id = up.UserId
WHERE       u.Email NOT IN
            (
                SELECT  Email
                FROM    BlackList
            )

但由于用户存储库是特定于用户的,并且模型中的用户和黑名单之间没有关系设置,我不知道如何子查询黑名单。我认为用户表和黑名单表之间不应该有关系,因为黑名单中的电子邮件是从第三方填充的,并且独立于用户表。

首先使用EF代码的存储库模式时的Linq子查询

也许我误解了,但您可以在LINQ中定义一个子查询,如下所示:

IQueryable<string> blacklistedMailAddresses =
    Database.Set<Blacklist>().Select(b => b.Email);
var result = Database.Set<User>()
    .Where(x => x.UsersProccessed.Any())
    .Where(x => !blacklistedMailAddresses.Contains(x.Email))
    .ToList();