[英]FromSql method when used with stored procedure cannot be composed in EF Core 3.1
我正在嘗試調用存儲過程以使用 EF Core 檢索單個記錄,但我不斷收到異常:
System.InvalidOperationException: 'FromSqlRaw 或 FromSqlInterpolated 是用不可組合的 SQL 調用的,並有一個查詢在它上面構成。 考慮在 FromSqlRaw 或 FromSqlInterpolated 方法之后調用AsEnumerable
以在客戶端執行組合。
這里: ef-core-3.0 broken-changes建議使用 use.AsEnumerable() 但它沒有效果。 我不明白為什么它認為我正在嘗試編寫此 SQL 代碼:
var result = context.Set<TicketDetails>()
.FromSqlInterpolated($"EXECUTE GetTicket @TicketId = {id}")
.AsEnumerable()
.FirstOrDefault();
這里還有一個類似的問題,它沒有為我提供解決方案。
我發現的一個問題,雖然它可能不適用於這種情況,但我有一個從另一個 class 繼承的 object,如果我為 class 調用存儲過程,我收到了錯誤消息。 一旦我刪除了 inheritance 並將所有道具復制到孩子 class ,一切都恢復了。
我有:
public class Role
{
public int RoleID { get; set; }
public string RoleName { get; set; }
}
和
public class UserRole : Role
{
public string Email { get; set; }
public int? UserRoleID { get; set; }
}
我將其更改為:
public class UserRole
{
public string Email { get; set; }
public int? UserRoleID { get; set; }
public int RoleID { get; set; }
public string RoleName { get; set; }
}
在那之后,一切都重新開始了。
我正在使用另一種有效的機制-因此您可以將一行或多行返回到 C# class
這是我的存儲過程的數據庫集
/// <summary>
/// Stored Proc Visits
/// </summary>
public virtual DbSet<Visits> SP_Visits { get; set; }
這是返回列表的代碼,但您將用 FirstOrDefaultAsync 替換最后一部分。 您必須確保參數與 SQL 的順序相同,盡管創建了它們的名稱 - DBContext 代碼只是忽略了這一點。 您還可以在 SQL 中設置參數,例如 @Sort=@Sort 通過匹配名稱而不是順序來工作
SqlParameter[] parameters = {
new SqlParameter("DateFrom", dateFrom),
new SqlParameter("DateTo", dateTo),
new SqlParameter("Aggregation", aggregation),
new SqlParameter("Sort", sort)
};
return await SP_Visits.FromSqlRaw("EXECUTE dbo.sp_Visits @DateFrom, @DateTo, @Aggregation, @Sort", parameters).ToListAsync();
我的解決方案是在對原始 sql 查詢的結果執行任何操作之前添加.AsEnumerable() 。
var results = ExecuteMyRawSqlQuery();
results.AsEnumerable().Select(r=> r.MyColumn).ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.