Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 首先使用带有EF代码的存储库模式时的Linq子查询_C#_Linq_Entity Framework_Repository_Ef Code First - Fatal编程技术网

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

C# 首先使用带有EF代码的存储库模式时的Linq子查询,c#,linq,entity-framework,repository,ef-code-first,C#,Linq,Entity Framework,Repository,Ef Code First,目前,我首先使用一种通用存储库模式和实体框架代码: public interface IRepository<TEntity> where TEntity : class { void Add(TEntity entity); void Delete(TEntity entity); TEntity GetById(int id); IEnumerable<TEntity> GetAll(); } public interface IUs

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

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;
}

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

也许我误解了,但您可以在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();
IQueryable blacklistedMailAddresses=
Database.Set().Select(b=>b.Email);
var result=Database.Set()
.Where(x=>x.usersProcessed.Any())
.Where(x=>!blacklistedMailAddresses.Contains(x.Email))
.ToList();

问题是我无法在UserRepository中执行Database.Set(),因为它是特定于用户的。也许我需要将IQueryable传递给GetAllWithSubQuery?您试图做的似乎不适用于存储库。为什么不创建一个同时使用用户存储库和黑名单存储库的服务?+1-如果要在查询中连接东西,它们应该在同一个存储库中
SELECT      u.Email
FROM        Users u INNER JOIN UsersProcessed up ON u.Id = up.UserId
WHERE       u.Email NOT IN
            (
                SELECT  Email
                FROM    BlackList
            )
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();