Подзапрос Linq при первом использовании шаблона репозитория с кодом EF - PullRequest
3 голосов
/ 12 января 2012

В настоящее время я использую общий шаблон репозитория с кодом Entity Framework:

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
            )

Но так как репозиторий User является специфичным для пользователя, и в модели нет настройки отношений между User и BlackList, я нене знаю, как подзапрос BlackList.Я не верю, что между таблицами User и BlackList должна существовать связь, потому что электронные письма в BlackList заполняются от третьей стороны и не зависят от таблицы User.

1 Ответ

1 голос
/ 12 января 2012

Возможно, я неправильно понял, но вы можете определить подзапрос в 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();
...