2010-11-12 7 views
2

J'utilise L2S pour les opérations de base de données dans mon asp.net je demande mvc requête suivante simple dans mon dépôtUtilisation de la fonction personnalisée dans la requête Linq

(from pt in db.oaProjectTasks 
        where pt.ProjectID == ProjectID 
        join t in db.oaTasks on pt.TaskID equals t.TaskID 
        where t.ParentTaskID == null 
        let daypassed = GetDaysPassed(t.StartDate,t.Duration) 
        select new ChartTask{TaskNumber = t.TaskNumber,StartDate = t.StartDate, 
        DurationRemaining = t.Duration - daypassed,TaskDescription = t.Task, DaysPassed = daypassed,Duration = t.Duration }).ToList(); 

ci-dessous est le defination de la méthode GetDayPassed

private int GetDaysPassed(DateTime StartDate, int Duration) 
     { 
      int retVal; 
      if ((DateTime.Now - StartDate).Days > 0) 
      { 
       if ((DateTime.Now - StartDate.AddDays(Duration)).Days > 0) 
       { 
        retVal = Duration; 
       } 
       else 
       { 
        retVal = (DateTime.Now - StartDate).Days; 
       } 
      } 
      else 
      { 
       retVal = 0; 
      } 
      return retVal; 
     } 

il n'y a pas d'erreur de temps de compilation, cependant, quand j'exécute le code, il me donne invalidOperationException avec le message suivant.

Could not translate expression 'Table(oaProjectTask).Where(pt => (pt.ProjectID == Invoke(value(System.Func`1[System.Int64])))).Join(Table(oaTask), pt => pt.TaskID, t => t.TaskID, (pt, t) => new <>f__AnonymousType5f`2(pt = pt, t = t)).Where(<>h__TransparentIdentifier2 => (<>h__TransparentIdentifier2.t.ParentTaskID == null)).Select(<>h__TransparentIdentifier2 => new 

comment puis-je contourner ce problème? Si l'appel d'une méthode dans une requête n'est pas autorisé, comment puis-je effectuer un calcul simple dans la requête Linq au lieu d'appeler la méthode GetDayPassed?

Répondre

5

Vous pouvez essayer ceci:

(from pt in db.oaProjectTasks 
where pt.ProjectID == ProjectID 
join t in db.oaTasks on pt.TaskID equals t.TaskID 
where t.ParentTaskID == null 
select t) 
    .ToList() // T-SQL query will be executed here and result will be returned 
    .Select(t => new ChartTask { 
     TaskNumber = t.TaskNumber, 
     StartDate = t.StartDate, 
     DurationRemaining = t.Duration - GetDaysPassed(t.StartDate,t.Duration), 
     TaskDescription = t.Task, 
     DaysPassed = GetDaysPassed(t.StartDate,t.Duration), 
     Duration = t.Duration }); 

Le problème est que LINQ to Sql essaie de traduire votre fonction personnalisée à T-SQL et comme il ne sait pas comment faire, il va jeter l'exception. Dans mon cas, Linq construira la requête, l'exécutera (après l'appel de .ToList()) et votre fonction sera appelée Linq to query.

Questions connexes