序列不包含元素错误

时间:2016-01-21 10:54:15

标签: c# entity-framework linq asp.net-mvc-4

我的dbstructure如下

StudentRegistrationTable

Id      Name     
5       Sachin 

StudentReceiptTable

Id      StudRegId     Fee    ST     Total      Status     DueDate 
1         5           873   127    1000         1        01/05/2016
2         5           873   127    2000         1        01/15/2016
3         5           873   127    3000         0        01/25/2016
4         5           873   127    4000         0        01/28/2016
5         5           873   127    5000         0        01/30/2016

状态表示付款方式。状态1表示学生已支付收据,0表示未付款

查询

  _dTableReg = _db.StudentRegistrations
                .AsEnumerable()
                .Where(r => (..condition))
                .Select(r => new RegistraionVM.RegDataTable
                 {    
                    ...
                    ...                      
                    NextDueAmount = r.StudentReceipts.
                                     Where(rc => rc.Status == false)
                                     .First().Total.ToString(),
                    NextDueDate = r.StudentReceipts.
                                    Where(rc => rc.Status == false)
                                    .First().DueDate.Date.ToString('dd/MM/yyyy')                                     
                }).OrderByDescending(r => r.RegistrationID).ToList();

以上查询返回第一个未付金额和日期(3000& 01/25/2016)。

当学生已经支付了所有收据(即状态将设置为1)并且我收到Sequence contains no elements errror时出现问题。在这种情况下,我想在FULL PAID中返回NextDueAmount }和NexDueDate

RegDataTable类

    public class RegDataTable
    {       
        ...
        ...     
        public string NextDueAmount { get; set; }
        public string NextDueDate { get; set; }           

    }      

1 个答案:

答案 0 :(得分:2)

使用.First()会引发错误,StudentReceipt的集合不会返回任何项目(即所有项目的Statustrue时)。您需要使用.FirstOrDefault(),然后检查值是null,如果不是,则访问TotalDueDate属性。

这可能会使您的控制器代码变得不必要地复杂(并且您还访问数据库两次以获取集合)所以我建议您使用视图模型(如果尚未使用)以及其他只读属性来返回结果

public class RegDataTableVM
{
  ....
  public StudentReceipt Receipt { get; set; }
  public string NextDueAmount
  {
    get { return Receipt == null ? "FULL PAID" ? Receipt.Total.ToString() }
  }
  public string NextDueDate 
  {
    get { return Receipt == null ? "FULL PAID" ? Receipt.DueDate.ToString("dd/MM/yyyy") }
  }

并将查询修改为

_dTableReg = _db.StudentRegistrations
  .Where(r => (..condition))
  .Select(r => new RegDataTableVM
  {    
    ...
    ...
    Receipt = r.StudentReceipts.Where(rc => rc.Status == false).FirstOrDefault()                                     
  }).OrderByDescending(r => r.RegistrationID).ToList();

附注:如果您使用DisplayFor()生成html,还可以使用DisplayFormatAttribute

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", NullDisplayText = "FULL PAID"
public DateTime? NextDueDate
{
  get { return return Receipt == null ? null ? Receipt.DueDate }
}