我的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; }
}
答案 0 :(得分:2)
使用.First()
会引发错误,StudentReceipt
的集合不会返回任何项目(即所有项目的Status
为true
时)。您需要使用.FirstOrDefault()
,然后检查值是null
,如果不是,则访问Total
和DueDate
属性。
这可能会使您的控制器代码变得不必要地复杂(并且您还访问数据库两次以获取集合)所以我建议您使用视图模型(如果尚未使用)以及其他只读属性来返回结果
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 }
}