IDでエンティティを取得するか、すべてのエンティティを取得するための汎用リポジトリがあります。
internal class Repository<TEntity> : IRepository<TEntity>
where TEntity : BaseEntity
{
protected SaiContext Context { get; }
/// <summary>Gets the entity set.</summary>
protected virtual DbSet<TEntity> Set => Context.Set<TEntity>();
public Repository(SaiContext context)
{
Context = context;
}
public async Task<TEntity> GetAsync(int entityId, IEnumerable<string> includeProperties = null)
{
try
{
return await GetQueryableWithIncludes(includeProperties).SingleAsync(entity => entity.Id == entityId);
}
catch (InvalidOperationException)
{
throw new EntityNotFoundException(typeof(TEntity), entityId);
}
}
public async Task<IEnumerable<TEntity>> GetAllAsync(IEnumerable<string> includeProperties = null)
{
return await GetQueryableWithIncludes(includeProperties).ToListAsync();
}
protected IQueryable<TEntity> GetQueryableWithIncludes(IEnumerable<string> includeProperties = null)
{
IQueryable<TEntity> queryable = Set;
if (includeProperties == null)
{
return queryable;
}
foreach (var propertyName in includeProperties)
{
queryable = queryable.Include(propertyName);
}
return queryable;
}
}
エンティティ関係の DbContext を構成した後、ナビゲーション プロパティと残りのすべてがすべてのエンティティに対して正しく読み込まれます。
ここで、すべてのエンティティが有効範囲を持つように、テンポラル SQL テーブルを使用するよう求められました。
SQL ではFOR SYSTEM_TIME AS OF @validityDate
、クエリに含めます。
を尊重するために既存の実装を適応させる最も簡単な方法は何@validityDate
ですか?
私が試したこと:
- SQL クエリを実行するときに必要なシステム時間を構成する方法を探します。問題: 方法が見つかりませんでした。
- パラメーターとして渡すことができるテーブル値関数を介してクエリを公開し
@validityDate
ます。問題: Linq2Sql を使用してパラメーターを渡すことができません (または、少なくとも方法がわかりませんでした)。 - 結合を実行するテーブル値関数を (EF に実行させるのではなく) 作成し、 で呼び出すことができるようにし
context.FromSqlRaw(<query>)
ます。問題: C# オブジェクト ツリーを作成する方法は? (1 対多の関係があるため、複数の行が返されます)
私が見つけた一時テーブルを使用したすべての例では、FromSqlRaw
. 可能であれば、それを避けたいと思います。これは、DB コンテキストの全体像が役に立たなくなり、マッピング用の追加コードを含める必要があることを意味するためです。