繁体   English   中英

实体框架“FromSqlRaw 或 FromSqlInterpolated 是用不可组合的 SQL 调用的,并且查询在它上面组合。” 返回对象的错误

[英]Entity Framework "FromSqlRaw or FromSqlInterpolated was called with non-composable SQL and with a query composing over it." error for a return object

我有这个看法

[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 IQueriable to IEnumerable and resolve result
                .Select(x => new EntityDTO()  //You are anyway using all results, so is ok
                {
                    ID = x.ID,
                    PredictedEntityTypeId = new LookupTableDetails() { Id = x.PredictedEntityTypeId, Name = x.PredictedEntityTypeId == 1 ? "Entity1" : "Entity2" },
                    IsManuallyChanged = x.IsManuallyChanged
                }).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM