2013-03-28 43 views
1

我在视图中使用了MVC平台和jqGrid。下面是控制器代码返回JSON到电网方法x在使用静态类时没有支持的SQL转换

IQueryable<CalendarViewModel> callendars = 
      from call in (new KYTCDataContext()).Calendars 
      where call.AcademicYear == id 
      select Matcher.Calendar(call); 

     if (jqGridParameters._search != false) 
     { 
      callendars = callendars.Where(jqGridParameters.WhereClause); 
     } 

     if (jqGridParameters.sidx != null) 
      callendars = callendars.OrderBy(
       jqGridParameters.sidx.Substring(8) + " " + jqGridParameters.sord.ToLower()); 
     var count = callendars.Count(); 
     int pageIndex = jqGridParameters.page; 

匹配器是一个静态类的部分。下面是类

public static class Matcher 
    { 
public static CalendarViewModel Calendar(Calendar call) 
     { 
      return new CalendarViewModel 
      { 
       ID = call.ID, 
       Name = call.Name, 
       StartDate = call.StartDate, 
       EndDate = call.EndDate, 
       AcademicYear = call.AcademicYear 
      }; 
     } 
} 

的在线路所使用的方法

var count = callendars.Count(); 

我收到此错误:

方法“KYTC.Models.CalendarViewModel月历(KYTC.Data.Calendar) '没有支持到SQL的转换。

但是当我改变LINQ查询到这一点:

IQueryable<CalendarViewModel> callendars = 
      from call in (new KYTCDataContext()).Calendars 
      where call.AcademicYear == id 
      select new CalendarViewModel 
      { 
       ID = call.ID, 
       Name = call.Name, 
       StartDate = call.StartDate, 
       EndDate = call.EndDate, 
       AcademicYear = call.AcademicYear 
      }; 

我的代码运行良好。

我的班级定义有什么问题?

回答

0

你的类定义没有问题。问题是你根本无法在Linq-to-SQL(或EntityFramework)查询中调用任意函数。只有少数预定义的方法可以转换为SQL语法。您的最终方法是从查询返回CalendarViewModel对象的正确方法。

但是,你也可以这样做:

public static Expression<Func<Calendar, CalendarViewModel>> CalendarExpression() 
{ 
    return c => new CalendarViewModel 
    { 
     ID = c.ID, 
     Name = c.Name, 
     StartDate = c.StartDate, 
     EndDate = c.EndDate, 
     AcademicYear = c.AcademicYear 
    }; 
} 

var calendarExpr = Match.CalendarExpression(); 
IQueryable<CalendarViewModel> callendars = 
    (from call in (new KYTCDataContext()).Calendars 
    where call.AcademicYear == id 
    select call) 
    .Select(calendarExpr); 
+0

非常感谢你,我有很多现在在我的代码chaning的==>去上班。 – 2013-03-29 14:27:01

相关问题