在MVC中将lambda表达式转换为Json

在MVC中将lambda表达式转换为Json,json,asp.net-mvc,entity-framework,lambda,kendo-ui,Json,Asp.net Mvc,Entity Framework,Lambda,Kendo Ui,在转换控制器中的lambda表达式时,我收到一个错误(“无法将lambda表达式转换为类型‘string’,因为它不是委托类型”)。我有3个实体,如下所示: 实体: public class Student { public int ID { get; set; } public string Course { get; set; } public int CityID { get; set; } public virtual City City { g

在转换控制器中的lambda表达式时,我收到一个错误(“无法将lambda表达式转换为类型‘string’,因为它不是委托类型”)。我有3个实体,如下所示:

实体:

public class Student
{
    public int ID { get; set; }

    public string Course { get; set; }  

    public int CityID { get; set; }

    public virtual City City { get; set; }
}


public class City
{
    public int ID { get; set; }        

    public string Name { get; set; }

    public int RegionID { get; set; }

    public virtual Region Region { get; set; }

    public virtual ICollection<Student> Students { get; set; }    
}


public class Region
{
    public int ID { get; set; }

    public string Name { get; set; }

    public virtual ICollection<City> Cities { get; set; } 
}
public ActionResult Index_Read([DataSourceRequest] DataSourceRequest request)
    {
        var dataContext = repository.Students;
        var students = dataContext.ToDataSourceResult(request, m => new 
        {
            ID = m.ID,
            Course = m.Course,

            City = m.City.Name, //I can get City name and show it in View.
            MyRegionName = m.City.Region.Name //I can get region name and assign it to 
//"MyRegionName" parameter in JSON. However in View I cannot get it using "MyRegionName" paremeter  
        });           

        return Json(students, JsonRequestBehavior.AllowGet);
    }
@model IEnumerable<Student>


@(Html.Kendo().Grid<Student>()
    .Name("Grid")
    .Columns(columns =>
    {
        columns.Bound(m => m.ID);
        columns.Bound(m => m.Course);
        columns.Bound(m => m.City);
        columns.Bound(m => m.MyRegionName);
    })
    .Pageable()
    .Sortable()
    .Filterable()
    .Scrollable()
    .Groupable()    
    .DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("Index_Read", "Student"))
    )        
)

查看:

public class Student
{
    public int ID { get; set; }

    public string Course { get; set; }  

    public int CityID { get; set; }

    public virtual City City { get; set; }
}


public class City
{
    public int ID { get; set; }        

    public string Name { get; set; }

    public int RegionID { get; set; }

    public virtual Region Region { get; set; }

    public virtual ICollection<Student> Students { get; set; }    
}


public class Region
{
    public int ID { get; set; }

    public string Name { get; set; }

    public virtual ICollection<City> Cities { get; set; } 
}
public ActionResult Index_Read([DataSourceRequest] DataSourceRequest request)
    {
        var dataContext = repository.Students;
        var students = dataContext.ToDataSourceResult(request, m => new 
        {
            ID = m.ID,
            Course = m.Course,

            City = m.City.Name, //I can get City name and show it in View.
            MyRegionName = m.City.Region.Name //I can get region name and assign it to 
//"MyRegionName" parameter in JSON. However in View I cannot get it using "MyRegionName" paremeter  
        });           

        return Json(students, JsonRequestBehavior.AllowGet);
    }
@model IEnumerable<Student>


@(Html.Kendo().Grid<Student>()
    .Name("Grid")
    .Columns(columns =>
    {
        columns.Bound(m => m.ID);
        columns.Bound(m => m.Course);
        columns.Bound(m => m.City);
        columns.Bound(m => m.MyRegionName);
    })
    .Pageable()
    .Sortable()
    .Filterable()
    .Scrollable()
    .Groupable()    
    .DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("Index_Read", "Student"))
    )        
)

可能与学生实体中存在
City
参数有关。但是
City
实体中没有
MyRegionName
属性。

我假设发生这种情况是因为
Student
类没有名为
MyRegionName
的属性

你有两个选择

1) 创建一个看起来像学生模型的ViewModel,但使其具有这样的属性。还要确保在
ToDataSourceResult
的投影函数中创建了这些新的ViewModel类型,而不是匿名对象

2) 只需使用模板列。e、 g

columns.Template(@<text></text>).Title("MyRegionName").ClientTemplate("#=MyRegionName#");
columns.Template(@).Title(“MyRegionName”).ClientTemplate(“#=MyRegionName”);

非常感谢您的解释。我想使用第二个选项,因为它非常简单。另一方面,有一个小问题:列标题似乎不是其他列标题。我试图找到其他人在这个标题上使用的类,但没有成功(使用“k-link”类)。有没有想过我可以将标准的剑道ui网格头类应用到这个类中?我尝试使用如下标题属性,但没有成功。再次感谢.columns.Template(@).Title(“MyRegionName”).ClientTemplate(“#=MyRegionName”).HeaderHtmlAttributes(新的{@class=“k-link”});