2012-01-12 6 views
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テーブルの間には関係があるとは思われません。

答えて

1

はおそらく、私は誤解していますが、このような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(); 
+0

問題は、私はそのユーザーの特定のため、UserRepository内Database.Set ()を行うことができないということです。おそらくIQueryableをGetAllWithSubQueryに渡す必要がありますか? – Thomas

+0

あなたがしようとしていることは、リポジトリの仕事のようには見えません。なぜユーザーリポジトリとブラックリストリポジトリの両方を使用するサービスを作成しないのですか? – Steven

+1

+1 - クエリで接続する場合は、同じリポジトリにある必要がありますIMHO –

関連する問題