したがって、バケットからリポジトリのコレクションを取得し、それらのリポジトリをループして、期限切れにする必要があるリポジトリ内のすべてのレコードを見つけてから期限切れにする必要があるメソッドがあります。Func を使用して Invoke を実行する方法がわかりません。何かご意見は?私は間違った道を進んでいますか?
public void DeactivateNonTransversableExpiredRecords()
{
databucket = new AdminBucket(PublishingFactory.AuthoringContext);
IEnumerable<Tuple<dynamic, Type>> nonTransversableList = this.GetNonTransversableRepositories(databucket);
foreach (Tuple<dynamic, Type> repository in nonTransversableList)
{
Type repoType = repository.Item1.GetType(); // RepositoryType
var method = repoType.GetMethod("FindBy"); // Method
var entityType = repository.Item2; // EntityType
// Not working
IQueryable recordsToExpire = method.Invoke(new Func<BaseEntity, bool>((x) => x.IsActive));
foreach (var row in recordsToExpire)
{
((BaseEntity) row).IsActive = false;
repository.Item1.Edit((BaseEntity) row);
}
}
}`
編集: 解決策... @Eduard からの貢献は、この課題を解決する上で非常に貴重でした。彼の貢献に賛成票を投じますが、実装されたのは実際のソリューションではありませんでした。
寄贈されたコードを通じて、私が行っていたように IQueryable を動的変数に返すと、レコードをデータベースに保存しようとしたときに問題が発生することがわかりました。読み取り専用セットを使用する場合は、@ Eduard のソリューションがエレガントに機能します。
モデルの BaseRepository.FindBy()
に、同じリポジトリ内のメソッドを呼び出すパブリケーション固有のメソッドを作成することになりました。この出版物固有のメソッドはIList<T>
、出版物アプリケーションに を返します。これにより、コレクションを列挙して実行するときに動的変数が適切に機能し、.Edit()
どのタイプがどのリポジトリに移動するかを気にする必要がなくなります。デフォルトを使用すると、「セッションで他のスレッドが実行されているため、新しいトランザクションは許可されていません」という EF5 の吐き気の原因となっ.FindBy()
た a が返されました。IQueryable<T>
ここに作業サンプルがあります
モデルの BaseRepository コード
public IList<T> GetItemsToExpire(DateTime date)
{
return this.GetActive(x => x.ExpirationDate <= date).ToList<T>();
}
public virtual IQueryable<T> GetActive(Expression<Func<T, bool>> predicate)
{
return this.GetActive().Where(predicate);
}
public virtual new IQueryable<T> GetActive()
{
return this.FindBy(entity => entity.IsActive)
}
パブリケーション サービス コード
public void DeactivateNonTransversableExpiredRecords()
{
databucket = new AdminBucket(PublishingFactory.AuthoringContext);
IEnumerable<dynamic> nonTransversableRepositories = this.GetNonTransversableRepositories(databucket);
foreach (dynamic repository in nonTransversableRepositories)
{
dynamic activeRecordsReadyToExpire = repository.GetItemsToExpire(DateTime.Now.AddDays(-1));
foreach (var record in activeRecordsReadyToExpire)
{
((BaseEntity)record).IsActive = false;
repository.Edit(record, true);
}
}
}