在Asp.net MVC中如何绑定Linq加入ViewModel?

问题描述 投票:0回答:1

在这里,我试图通过使用LINQ加入两个表来获取列表,我想从ContestantRatings表中获取ContestantId。但它在行ContestantId = Convert.ToInt32(CR.ContestantId)中显示错误,该错误表示:'LINQ to Entities无法识别方法Int32 ToInt32(System.Object)方法,并且此方法无法转换为商店表达式。 。 任何帮助将受到高度赞赏。 以下是我的代码

public List<ContestantRating.Core.ViewModel.ContestantRatingVM> GetContestantRatingList()
{
    var contestantRatingList = (from C in db.Contestants where C.IsActive==true
                                join CR in db.ContestantRatings on C.Id equals CR.ContestantId 
                                select new ContestantRatingVM
                                {
                                    ContestantId  = Convert.ToInt32(CR.ContestantId),
                                    FirstName = C.FirstName,
                                    LastName = C.LastName,
                                    DateOfBirth = C.DateOfBirth,
                                    District = C.District.DistrictName,
                                    Rating = CR.Rating,
                                    RatingId = CR.Id,
                                    RatedDate=CR.RatedDate
                                }).ToList().OrderByDescending(x => x.RatingId);
    return contestantRatingList.ToList();
}

下面是我使用的viewmodel ContestantRatingVM

public class ContestantRatingVM
{
    public int  ContestantId { get; set; }
    public Nullable<int> HomeZoneId { get; set; }
    public string District { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Nullable<System.DateTime> DateOfBirth { get; set; }
    public Nullable<bool> IsActive { get; set; }
    public string Gender { get; set; }
    public string PhotoUrl { get; set; }
    public string Address { get; set; }
    public int RatingId { get; set; }
    public Nullable<decimal> Rating { get; set; }
    public Nullable<System.DateTime> RatedDate { get; set; }
}
c# asp.net-mvc linq
1个回答
0
投票

问题是对Convert.ToInt32的呼吁。 Linq to entities将Linq查询转换为数据库查询,因此它支持一组有限的操作。为了解决这个问题,您有几种选择。

一种选择是在数据库查询后进行转换:

public List<ContestantRating.Core.ViewModel.ContestantRatingVM> GetContestantRatingList()
{
  var tempArray = (from c in db.Contestants where C.IsActive==true
                   join cr in db.ContestantRatings on C.Id equals CR.ContestantId 
                   select new { C = c, CR = cr }).ToArray();
  var contestantRatingList = from x in tempArray select new ContestantRatingVM
                                {
                                    ContestantId  = Convert.ToInt32(x.CR.ContestantId),
                                    FirstName = x.C.FirstName,
                                    // ...
                                }).ToList().OrderByDescending(x => x.RatingId);
  return contestantRatingList.ToList();
}

通过调用ToArray,您将查询发送到数据库,以便Linq to Enities不必处理Convert.ToInt32

© www.soinside.com 2019 - 2024. All rights reserved.