Ho provato da ore a cercare una soluzione per il mio problema ma nessun post mi ha aiutato.
Cerco di recuperare i record dal database utilizzando Linq (Entity Framework 6.0 / MVC 5.0) con la libreria.
System.Linq.Dynamic;
Codice completo qui sotto
using (var entities = new vskdbEntities())
{
entity.DataFields = "id, stack_trace";
_list = entities.vsk_error_log
.OrderBy(entity.Order)
.Select("New(" + entity.DataFields + ")")
.Skip(entity.PageSize * entity.PageNumber)
.Take(entity.PageSize)
.Cast<vsk_error_log>()
.ToList();
}
Ma a runtime questo genera un errore
Un'eccezione di tipo "System.NotSupportedException" si è verificata in EntityFramework.SqlServer.dll ma non è stata gestita nel codice utente
Informazioni aggiuntive: impossibile eseguire il cast del tipo 'DynamicClass1' per digitare 'VideoKit.framework.vsk_error_log'. LINQ to Entities supporta solo il casting di tipi primitivi o di enumerazione EDM.
So che c'è un problema con la clausola Select ma non so come risolvere questo problema di casting.
Aggiornamento n. 1:
Se provo ad usare il codice come mostrato di seguito, recupererà correttamente i dati
using (var entities = new vskdbEntities())
{
var context = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)entities).ObjectContext;
lst = context.CreateObjectSet<vsk_error_log>().AsEnumerable().Select("new (id, stack_trace)").Cast<DynamicClass>().ToList();
}
Ma i dati recuperati con tipo
Elenco generico di System.Linq.Dynamic.DynamicClass
Invece di vsk_error_log
Se provo a eseguire il cast con la classe corretta vsk_error_log anziché DynamicClass, ho ricevuto un errore
Impossibile eseguire il cast dell'oggetto di tipo 'DynamicClass1' per digitare 'VideoKit.framework.vsk_error_log'.
Dati restituiti mostrati nello screenshot
Per ottenere l'entità stessa da una query dinamica, devi usare la parola chiave it
, invece di new
:
using (var entities = new vskdbEntities())
{
_list = entities.vsk_error_log
.OrderBy(entity.Order)
.Select("it") // here "it"
.Skip(entity.PageSize * entity.PageNumber)
.Take(entity.PageSize)
.ToList();
}
Dal tuo commento capisco che stai cercando di ottenere entità vsk_error_log
parzialmente riempite. Puoi farlo utilizzando la parte principale della tua query e quindi convertire le istanze DynamicClass
nelle entità:
var result = new List<vsk_error_log>();
using (var entities = new vskdbEntities())
{
_list = entities.vsk_error_log
.OrderBy(entity.Order)
.Skip(entity.PageSize * entity.PageNumber)
.Take(entity.PageSize)
.Select("new (id, stack_trace)");
foreach(dynamic d in _list)
{
result.Add(new vsk_error_log { id = d.id, stack_trace = d.stack_trace } );
}
}
Aggiornamento: codice completo che funziona bene con l'output desiderato di seguito
var _list = new List<vsk_error_log>();
using (var entities = new vskdbEntities())
{
var context = ((IObjectContextAdapter)entities).ObjectContext;
var lst = context.CreateObjectSet<vsk_error_log>()
.AsEnumerable()
.Select("new(id,stack_trace)")
.Cast<DynamicClass>()
.Skip(entity.PageSize * (entity.PageNumber - 1))
.Take(entity.PageSize)
.ToList();
foreach (dynamic d in lst)
{
_list.Add(new vsk_error_log { id = d.id, stack_trace = d.stack_trace });
}
}
Il metodo Cast<type>()
non sa come eseguire il cast dell'oggetto dinamico che hai creato nel tipo che hai specificato, quindi dovrai farlo manualmente:
using (var entities = new vskdbEntities())
{
entity.DataFields = "id, stack_trace";
_list = entities.vsk_error_log
.OrderBy(entity.Order)
.Select("New(" + entity.DataFields + ")")
.Skip(entity.PageSize * entity.PageNumber)
.Take(entity.PageSize)
.Select(x => new vsk_error_log
{
Property1 = x.Property1,
Property2 = x.Property2,
//etc...
})
.ToList();
}