1

ビューで MVC プラットフォームと jqGrid を使用しています。以下はコントローラーコードの一部で、json をグリッドに返します

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;

Matcher は静的クラスです。以下はクラスの使用メソッドです

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

私のコードはうまく動作しています。

クラス定義の何が問題になっていますか?

4

1 に答える 1

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);
于 2013-03-28T15:53:55.450 に答える