簡體   English   中英

與存儲過程一起使用時的 FromSql 方法無法在 EF Core 3.1 中組合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM