返回对象的实体框架"FromSqlRaw or FromSqlInterpolated was called with non-composable SQL and with a query comp



我有这个视图

[Table("vw_Entity", Schema = "c")]
public partial class vw_Entity : BaseEntity
{
public long? PredictedEntityTypeID { get; set; } 
public bool IsManuallyChanged { get; set; } 
}

其中BaseEntity是只存储我的IDUUID的类。

这是我DTO返回对象:

public class EntityDTO
{
public long ID { get; set; }
public LookupTableDetails PredictedEntityTypeId { get; set; }
public bool IsManuallyChanged { get; set; }
}

其中LookupTableDetails看起来像:

public class LookupTableDetails
{
public long Id { get; set; }
public string Name { get; set; }
}

现在我有了这个存储过程,基本上是一个PATCH。我使用下面的代码片段调用它:

var data = await _context.vw_Entity.FromSqlRaw("EXECUTE core.Update_Entity @EntityID", parameters)
.Select(x => new EntityDTO()
{
ID = x.ID,
PredictedEntityTypeId = new LookupTableDetails() { Id = x.PredictedEntityTypeId, Name = x.PredictedEntityTypeId == 1 ? "Entity1" : "Entity2" },
IsManuallyChanged = x.IsManuallyChanged
}).ToListAsync();

但是,这会崩溃并产生一个错误

FromSqlRaw或FromSqlInterpolated是用不可组合的SQL和对其进行组合的查询调用的

我知道这个错误做了什么,如果我有一些其他类的对象在我的视图中,那么存储过程不能正确映射它并返回错误,但在这种情况下,我的视图从该类型的障碍中清除,所有我需要做的就是在我的DTO对象中返回LookupTableDetails。错误在

PredictedEntityTypeId = new LookupTableDetails() { Id = x.PredictedEntityTypeId, Name = x.PredictedEntityTypeId == 1 ? "Entity1" : "Entity2" }

我尝试了互联网上提供的大多数解决方案,例如用IgnoreFilters..,AsEnumerable()等包装它。

任何想法是什么原因,我怎么能防止它再次发生在未来,即修复它?: D

由于要迭代第一个查询的结果,请尝试更改为:

var data = _context.vw_Entity.FromSqlRaw("EXECUTE core.Update_Entity @EntityID", parameters)
.ToList() // force change from IQueryable to IEnumerable and resolve result
.Select(x => new EntityDTO()  // You are anyway using all results, so this is ok
{
ID = x.ID,
PredictedEntityTypeId = new LookupTableDetails() { Id = x.PredictedEntityTypeId, Name = x.PredictedEntityTypeId == 1 ? "Entity1" : "Entity2" },
IsManuallyChanged = x.IsManuallyChanged
}).ToList();

相关内容

  • 没有找到相关文章

最新更新