3
をEFコードでリポジトリパターンを使用しているとき、私は現在、最初のEntity Frameworkのコードで一般的なリポジトリのパターンを使用します。LINQのサブクエリ最初
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固有のものであり、モデル内のUserとBlackListの間には関係が設定されていないので、BlackListをサブクエリする方法はわかりません。 BlackListの電子メールは第三者から取り込まれ、Userテーブルから独立しているため、UserテーブルとBlackListテーブルの間には関係があるとは思われません。
問題は、私はそのユーザーの特定のため、UserRepository内Database.Set()を行うことができないということです。おそらくIQueryableをGetAllWithSubQueryに渡す必要がありますか? –
Thomas
あなたがしようとしていることは、リポジトリの仕事のようには見えません。なぜユーザーリポジトリとブラックリストリポジトリの両方を使用するサービスを作成しないのですか? – Steven
+1 - クエリで接続する場合は、同じリポジトリにある必要がありますIMHO –