簡體   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