Errore del provider di dati .NET Framework interno 1025

.net c# entity-framework entity-framework-4 expression-trees

Domanda

IQueryable<Organization> query = context.Organizations;

Func<Reservation, bool> predicate = r => !r.IsDeleted;

query.Select(o => new { 
    Reservations = o.Reservations.Where(predicate)
}).ToList();

questa query genera l'eccezione "Errore 1025 del provider di dati di .NET Framework interno" ma la query di seguito non lo fa.

query.Select(o => new { 
    Reservations = o.Reservations.Where( r => !r.IsDeleted)
}).ToList();

Ho bisogno di usare il primo perché ho bisogno di controllare alcune dichiarazioni if ​​per costruire il predicato giusto. So che non posso usare se le affermazioni in questa circostanza sono il motivo per cui ho passato un delegato come parametro.

Come posso far funzionare la prima query?

Risposta accettata

Mentre le risposte sopra sono vere, si noti che quando si tenta di usarlo dopo un'istruzione select si deve chiamare AsQueryable() esplicitamente, altrimenti il ​​compilatore supporrà che stiamo provando ad usare i metodi IEnumerable, che si aspettano Func e non Expression<Func> .

Questo era probabilmente il problema del poster originale, altrimenti il ​​compilatore si lamenterà la maggior parte delle volte che sta cercando Expression<Func> e non Func .

Demo: il seguente non funzionerà:

MyContext.MySet.Where(m => 
      m.SubCollection.Select(s => s.SubItem).Any(expr))
         .Load()

Mentre il seguente funzionerà:

MyContext.MySet.Where(m => 
      m.SubCollection.Select(s => s.SubItem).AsQueryable().Any(expr))
         .Load()

Risposta popolare

Dopo aver creato la taglia (ratti!), Ho trovato questa risposta , che ha risolto il mio problema. (Il mio problema riguardava una chiamata .Any() , che è un po 'più complicata di questa domanda ...)

In breve, ecco la tua risposta:

IQueryable<Organization> query = context.Organizations;

Expression<Func<Reservation, bool>> expr = r => !r.IsDeleted;

query.Select(o => new { Reservations = o.Reservations.Where(expr) })
  .ToList();

Leggere la risposta di riferimento per una spiegazione del motivo per cui è necessario l' expr variabile locale e non è possibile fare riferimento direttamente a un altro metodo di tipo restituito Expression<Func<Reservation, bool>> .



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché