Di seguito è il mio metodo, che chiama una stored procedure.
public List<int> GetActivityListforUser(string userId)
{
IList<int> results = new List<int>();
context.LoadStoredProc("dbo.GetRegionOrganizationActivities")
.WithSqlParam("userId", userId)
.ExecuteStoredProc((handler) =>
{
results = handler.ReadToList<int>().ToList();
});
return results.ToList();
}
La mia procedura memorizzata dbo.GetRegionOrganizationActivities
restituisce solo un ID di colonna, che è il risultato richiesto al passaggio del parametro userId.
Il mio problema è nella seguente riga:
return results.ToList();
Riesco a vedere tutta la lista che viene dalla stored procedure, ma tutti i valori int sono 0. Il numero di liste corrisponde al conteggio dei risultati del proc memorizzato, ma i valori dovrebbero essere esempio: 1,2,3, ecc. Mostra 0,0, 0, ecc.
Qualcuno può dare qualche idea su ciò che sto facendo male?
Sembra che tu stia usando il pacchetto nuget Snickler.EFCore con EF Core.
Risposta breve: dovrai creare un oggetto complesso per consentire a questa libreria di mappare il tuo set di risultati, ad esempio:
public class RegionOrganizationActivity
{
public int Id { get; set; }
}
allora puoi usare questo per estrarre la tua lista di interi:
public List<int> GetActivityListforUser(string userId)
{
IList<RegionOrganizationActivity> results = new List<RegionOrganizationActivity>();
context.LoadStoredProc("dbo.GetRegionOrganizationActivities")
.WithSqlParam("userId", userId)
.ExecuteStoredProc((handler) =>
{
results = handler.ReadToList<RegionOrganizationActivity>();
});
return results.Select(activity => activity.Id).ToList();
}
Spiegazione:
handler.ReadToList<int>()
non funzionerà qui perché l' ReadToList<T>
supporta solo tipi complessi. Si presuppone che sia necessario creare un'istanza di T
e provare a far corrispondere le proprietà alle colonne.
Perché non ci sono proprietà da abbinare quando T
è int
, la seconda parte fallisce. Questo spiega perché stai ottenendo tutti i valori di 0: l'unica cosa che il metodo riesce a fare è un Activator.CreateInstance<int>()
che restituirà 0.
Il loro altro metodo di supporto ReadToValue
supporta solo un singolo valore di risultato, che non funzionerà neanche.
Ciò significa che non è possibile utilizzare questa libreria per mappare il risultato direttamente su List<int>
. Quindi avrai bisogno di usare oggetti complessi per abbinare il set di risultati.