C# 如何从实体框架核心查询多个时态表?
我的数据库中有多个时态表,我想编写一个查询,将这些表连接在一起,但也使用特定日期的数据 我创建了以下扩展方法来帮助获取截止日期的数据:C# 如何从实体框架核心查询多个时态表?,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我的数据库中有多个时态表,我想编写一个查询,将这些表连接在一起,但也使用特定日期的数据 我创建了以下扩展方法来帮助获取截止日期的数据: public static IQueryable<T> AsOf<T>(this DbSet<T> dbSet, DateTime? asOfDateTime) where T : class { if (dbSet == null) throw new ArgumentNullException(nameof(dbS
public static IQueryable<T> AsOf<T>(this DbSet<T> dbSet, DateTime? asOfDateTime) where T : class
{
if (dbSet == null) throw new ArgumentNullException(nameof(dbSet));
return asOfDateTime.HasValue
? dbSet.FromSql($"SELECT * FROM dbo.[{typeof(T).Name}] FOR SYSTEM_TIME AS OF {{0}}", asOfDateTime)
: dbSet;
}
但是,如果我尝试像这样将表连接在一起
from entity in context.Entities.AsOf(asOfDateTime)
select new Entity
{
entity.Name,
MyProperties = from myProperty in context.MyProperties.AsOf(asOfDateTime)
where myProperty.EntityId == entity.EntityId
select new MyProperty
{
...
然后我开始得到一个错误,比如
“Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable”类型的表达式
无法用于“Microsoft.EntityFrameworkCore.DbSet”类型的参数
方法'System.Linq.IQueryable1[MyProperty]AsOf[MyProperty](Microsoft.EntityFrameworkCore.DbSet
1[MyProperty],System.Nullable'1[System.DateTime])
参数名称:arg0
是否可以从实体框架核心查询多个时态表?语法是什么?目前我无法很好地回答这个问题,但我猜它在将其转换为Sql查询时遇到了问题。您可能需要将子查询作为LinqToSql单独运行,然后将它们连接在一起。这将避免LinqToSql必须可翻译为标准Sql的限制。您很可能在这里遇到问题“where myProperty.EntityId==entity.EntityId”。请参阅此github问题线程以获取解释@adam0101,在哪里可以查询多个时态表?@Alvykun,不幸的是没有。我最终使用了存储过程。有一件事确实帮助了我,那就是我为每个表创建了sql函数,这些表封装了as-of逻辑,以便查询易于编写和遵循。@Alvykun,我今天碰巧遇到了这个问题,它可能会帮助您:
from entity in context.Entities.AsOf(asOfDateTime)
select new Entity
{
entity.Name,
MyProperties = from myProperty in context.MyProperties.AsOf(asOfDateTime)
where myProperty.EntityId == entity.EntityId
select new MyProperty
{
...