2010-11-12 22 views
2

我使用L2S进行数据库操作在我的asp.net MVC应用程序我已经在我的仓库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(); 
下面

下面的简单查询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; 
     } 

没有编译时错误,但是,当我执行代码时,它给了我以下消息的invalidOperationException。

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 

我该如何解决这个问题?如果在查询中调用方法是不允许的我怎么能在Linq查询中做一个简单的计算而不是调用GetDayPassed方法?

回答

5

你可以试试这个:

(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 }); 

的问题是,Sql的Linq试图翻译您的自定义功能,T-SQL,并因为它不知道该怎么做,它会抛出异常。在我的情况下,Linq将构造查询,执行它(在调用.ToList()之后),并且您的函数将作为Linq调用到对象查询中。