2009-04-28 12 views
0

J'essaie d'écrire la courte ligne de code suivante d'une manière plus générique.Dynamic LINQ to Entity Count()

Ce que je veux réaliser est un nombre simple d'enregistrements, qui ont changé ou ont été créés depuis une certaine date.

public int GetChanges(DateTime LastActivityDate) 
    { 
     KHS.Innopas.Web.Library.DataModels.Documentation.DocumentationEntities ctx = 
      new KHS.Innopas.Web.Library.DataModels.Documentation.DocumentationEntities(); 

     return ctx.Images.Count(row => row.CreatedAt > LastActivityDate); 
    } 

Je souhaite modifier l'exemple ci-dessus à une fonction plus générique comme

public int GetChanges(MetaTable table, string columnName, DateTime LastActivityDate) 
    { 
     return table.Count(row => row.columnName > LastActivityDate); 
    } 

Ce que j'ai essayé jusqu'à présent est

public int GetChanges(MetaTable table, string columnName, DateTime lastActivityDate) 
    { 
        // query = {Table(LanguageText)} 
     var query = table.GetQuery(); 

     MetaColumn dateColumn; 
     table.TryGetColumn(columnName,out dateColumn); 

     if (dateColumn == null) 
      return new string[] {}; 

     var entityParam = Expression.Parameter(table.EntityType, "row"); 

     var property = Expression.Property(entityParam, dateColumn.Name); 

     var columnLambda = Expression.Lambda(property, entityParam); 

     var constant = Expression.Constant(lastActivityDate); 

     var GreaterThanCall = Expression.GreaterThan(columnLambda.Body, constant); 

     var whereLambda = Expression.Lambda(GreaterThanCall, entityParam); 


     var whereCall = Expression.Call(
      typeof(Queryable), 
      "Count", 
      new Type[] { query.ElementType }, 
      query.Expression, 
      whereLambda); 

     var result = query.Provider.CreateQuery(whereCall); 

     return result ; 
    } 

Le problème est maintenant que « whereCall » est incorrect et déclenche une erreur (en allemand). Des idées, comment ça doit ressembler?

Merci pour votre aide. Sebastian

Plus d'info: Ceci est l'erreur allemande:

Abfrageausdrücke für 'LINQ to Entities' können nur aus Instanzen konstruiert werden, die die IQueryable-Schnittstelle implementieren. Parametername: expression

Répondre

Questions connexes