2009-11-10 12 views
18

Abbiamo una classe chiamata Task:Passando func come parametro in LINQ to Entities e 'interno di dati .NET Framework errore Provider 1025' errore

public partial class Task : EntityObject 
{ 
    public EntityCollection<TaskUser> TaskUsers { get {...} set{...} } 
} 

E 'chiamato proprietà di navigazione TaskUsers, che contiene gli utenti allegato al presente taks:

public partial class TaskUser : EntityObject 
{ 
    public User User { get {...} set { } } 
} 

Ogni oggetto TaskUser ha oggetto Utente.

Ci viene dato IQueryable<Task> tasks. Vogliamo trovare compiti assegnati all'utente con ID = 1. Quando usiamo

tasks.Where(t => t.TaskUsers.Any(a => a.User.ID == 1)) 

tutto funziona bene. Quando usiamo

Func<TaskUser, bool> function = a => a.User.ID == 1; 
return tasks.Where(t => t.TaskUsers.Any(function)); 

otteniamo bello errore 'Internal .NET Framework Data Provider error 1025'. Perché? Voglio costruire filtri molto più complicati usando la classe Expression, ma se non riesco a passare il semplice Func, questo non può essere fatto. Cosa dovrei fare?

EDIT

Forse

Func<TaskUser, bool> function = a => a.User.ID == 1; 
return tasks.Where(t => t.TaskUsers.Any(function)); 

non funziona, ma

Expression<Func<TaskUser, bool>> expression = a => a.User.ID == 1; 
return tasks.Where(t => t.TaskUsers.AsQueryable().Any(expression)); 

opere! Questo è tutto ciò di cui avevo bisogno.

+0

Eh, ho appena postato una taglia su un [domanda simile] (http://stackoverflow.com/questions/11990158/internal- net-framework-data-provider-error-1025), prima di trovare la soluzione qui. Vuoi prendere la taglia? –

+0

In realtà, dopo aver provato a usare 'Expression' piuttosto che' Func', come hai fatto tu, il mio ** non ha funzionato. Altre idee? –

risposta

25

Bene, l'EF può solo tradurre espressioni, non funzioni.

cioè può tradurre questo testo:

Expression<Func<TaskUser,bool>> 

ma non questa:

Func<TaskUser,bool> 

Quanto a come unire le espressioni (in pseudo codice):

Expression<Func<TaskUser, bool>> expression = a => a.User.ID == 1; 
return tasks.Where(t => t.TaskUsers.Any(expression)); 

Ci sono probabilmente alcuni guru delle espressioni che possono aiutare in questo.

suggerisco una domanda follow concentrati su questo particolare problema

Alex

+12

Senza l'aiuto del guru: return tasks.Where (t => t.TaskUsers.AsQueryable(). Any (espressione)); – LukLed

+0

Cool, mi sono sempre chiesto. –

Problemi correlati