LINQ to Entities仅支持转换EDM原语或枚举类型

时间:2012-11-20 14:18:31

标签: asp.net-mvc-3 entity-framework asp.net-mvc-4 entity-framework-4.1 webgrid

我创建了一个MVC3应用程序,它使用WebGrid来填充数据库中的数据。

我的数据库有一些列。说

Id | FullName | Phone | Email

我可以对Id列进行排序。但是,如果我尝试对其他列进行排序,则会出现以下错误

  

无法将类型“MvcApp.Models.Student”强制转换为“MvcApp.Models.Student”。 LINQ to Entities仅支持转换EDM原语或枚举类型。

我尝试调试并查看错误的位置,我发现排序是完美的,但是当它将数据返回view时会出错

我的观看代码:

@{
    ViewBag.Title = "listStudents";
    Layout = "~/Views/Shared/_Layout.cshtml";
    WebGrid grid = new WebGrid(Model, canPage: true, canSort: true, rowsPerPage: 3); 
}

@grid.Pager(WebGridPagerModes.NextPrevious)
        @grid.GetHtml(  //Error at this line
        htmlAttributes: new { id = "grdListStudents" },
    fillEmptyRows: true,
    headerStyle: "tblHeader",
    tableStyle: "tablestyle",
    mode: WebGridPagerModes.All,
    firstText: "<< First",
    previousText: "< Previous", nextText: "Next >",
    lastText: "Last >>",
    columns: new[]{
        grid.Column("intID","SId",canSort:true),
        grid.Column("strFirstName","Name",canSort:true,format:(item)=>item.strFirstName+"   "+item.strLastName),
        grid.Column("strPhone","Phone",canSort:true),
        grid.Column("strEmail","Email",canSort:true),
    }
    )

这是我在控制器中的代码:

public readonly IStudentInfo _istudentrepository; 

public studentController( IStudentInfo _iStudentRepository)
{
    this._istudentrepository = _iStudentRepository;
}

public ActionResult listBidder(string sort, string sortdir, int? page)
{
    int startPage = 0;
    IEnumerable<Students> sList;
    if (page.HasValue && page.Value > 0)
    {
        startPage = page.Value;
    }
    sList = _istudentrepository.GetList(startPage, PageSize, sort, sortdir);
    return View(sList);                
}

接口IStudentInfo中的代码:

public interface IStudentInfo
{
    IEnumerable<Students> GetList(int intPage, int intRecords, string strSort, string sortdir);            
}

模型中的代码:

private MyEntity _entity;

public StudentListRepository(MyEntity Ent)
{
    this._entity = Ent;
}
public IEnumerable<Students> GetList(int intPage, int intRecords, string strSort, string sortdir)
{

    var finalresult = new Students();
    var bidList = (from userInfo in _entity.tbl_UserInf
                   join user in _entity.tbl_User on userInfo.UserId equals user.UserId
                   select new Students()
                   {
                       intID=user.UserId,
                       strFirstName = user.FirstName,
                       strEmail = userInfo.EmailId,
                       intPhone=userInfo.Phone
                   }).OrderByDescending(m => m.intID);
    finalresult.TotalResult = bidList.Count();
    switch (strSort)
    {
        case "intID":
            if (sortdir == "ASC")
            {
                sList = sList.OrderBy(r => r.Id);
            }
            else
            {
                sList= sList.OrderByDescending(r => r.Id);
            }
            break;
        case "strFirstName":
            if (sortdir == "ASC")
            {
                sList = sList.OrderBy(r => r.strFirstName);
            }
            else
            {
                sList= sList.OrderByDescending(r => r.strFirstName);
            }
            break;
        case "strEmail":
            if (sortdir == "ASC")
            {
                sList = sList.OrderBy(r => r.strEmail);
            }
            else
            {
                sList= sList.OrderByDescending(r => r.strEmail);
            }
            break;
        //repeat same for phone
    }

    finalresult.lstStudents = sList.Skip(intPage * intRecords)
                                   .Take(intRecords)
                                   .ToList();
    return sList.AsEnumerable();
}

我的代码有什么问题?如果有人知道发生了什么,请告诉我。

请帮忙

感谢,

1 个答案:

答案 0 :(得分:2)

尝试使用:

public ActionResult listBidder(string sort, string sortdir, int? page)
{
        int startPage = 0;
        if (page.HasValue && page.Value > 0)
        {
            startPage = page.Value;
        }
        var sList = _istudentrepository.GetList(startPage, PageSize, sort, sortdir);
        return View(sList);
}

public IEnumerable<Students> GetList(int intPage, int intRecords, string strSort, string sortdir)
{

        var finalresult = new Students();
        var bidList = (from userInfo in _entity.tbl_UserInf
                       join user in _entity.tbl_User on userInfo.UserId equals user.UserId
                       select new Students()
                       {
           intID=user.UserId,
                           strFirstName = user.FirstName,
                           strEmail = userInfo.EmailId,
                           intPhone=userInfo.Phone
                       }).OrderByDescending(m => m.intID);
       finalresult.TotalResult = bidList.Count();
       // There are some sorting and ordering
       finalresult.lstStudents = sList.Skip(intPage * intRecords).Take(intRecords).ToList();
       return bidList.ToArray();

}