В настоящее время я использую общий шаблон репозитория с кодом 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.