18 messaggi dal 04 giugno 2007
Buongiorno, ho questo problema:

In riferimento al link http://www.albahari.com/nutshell/predicatebuilder.aspx sto cercando di implementare una expression generica per gestire la validità temporale delle entità:

Quindi data una classe nel file EDMX (dove ometto per pulizia il codice generato in automatico) con due proprietà ValidFrom e ValidTo
            
public partial class MyEntity : global::System.Data.Objects.DataClasses.EntityObject            
{            
   ...           
   ...                  
   private global::System.DateTime _ValidFrom;           
   public global::System.DateTime ValidFrom           
   {           
       get ...; set ...;           
   }           
           
   private global::System.DateTime _ValidTo;           
   public global::System.DateTime ValidTo          
   {           
       get ...; set ...;           
   }           
   ...           
   ...           
}           

completo in un altro file la relativa partial class costringendola ad implementare l'interfaccia IValidFromTo
   
public interface IValidFromTo        
{        
   DateTime ValidFrom { get; }        
   DateTime ValidTo { get; }        
}                
           
public partial class MyEntity : IValidFromTo          
{          
                   
}         

in modo da poter poi scrivere la Generic Expression
          
public static Expression<Func<TEntity, bool>> IsValid<TEntity>(DateTime utcFrom, DateTime utcTo) where TEntity : IValidFromTo          
{          
   return e => (e.ValidFrom <= utcFrom) && (e.ValidTo >= utcTo);          
}          

che servirà per una query del tipo
    
IQueryable<MyEntity> query = this.ObjectContext.MyEntitySet.Where(MyExpression.IsValid<MyEntity>(DateTime.Now, DateTime.Now));    
                
return query.ToList();    

Il tutto viene compilato senza problemi, ma in runtime viene generata l'eccezione

Unable to cast the type 'MyEntity' to type 'IValidFromTo'. LINQ to Entities only supports casting Entity Data Model primitive types.


A questo punto chiedo:
1) mi sono scontrato con un limite di E.F. o sbaglio qualche cosa ?
2) dovesse essere un limite, esiste un workaround ?

Grazie in anticipo

Stefano
Purtroppo sì, è un limite.
L'alternativa è creare l'expression non usando il compilatore, ma a mano. Se provi a scorrere l'expression che ti IsValid dovrebbe esserci una struttura del tipo Expression.Equal(Expression.Property(Expression.Parameter(..), "ValidFrom") dove probabilmente il Parameter è di tipo IValidFromTo invece dell'entità vera e propria e questo incasina LINQ to Entities.
Quindi se crei tu l'espressione usando il tipo giusto, dovresti risolvere il problema.

Ciao

Il mio blog
Homepage

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.