2014-11-22 64 views
0

IQueryable设置为null我是新的链接,这是我的第一个任务使用它,它不顺利。 我有一个页面,可以按点击的列进行排序。 其中一列是Date列,DateSubmitted。当尝试OrderBy日期属性从类

我越来越不设置为对象的实例对象的错误...

我通过代码加强,发现只有等到它通过代码排序依据行列表对象包含的值。我认为这是因为dateAccepted属性包含null值,恰好在assignemnt data = data.OrderBy ...之前,数据包含416条记录,在传递赋值之后,它具有null并抛出错误。

我还有一个类似于这个问题的问题,我为重复道歉,但我真的需要一些解释,如果可能的话,以及一些关于如何解决这个问题的帮助。

我试着在dateAccepted后添加HasValue,但这没有什么区别。

任何帮助都是有价值的。非常感谢你。

var data = (from c in starter 
       select new ACPListObject() 
       { 
        contact = c, 
        Year = Year, 
        LastSentDate = (from s in c.smsContactFormSents orderby s.sentDateTime descending select s.sentDateTime).FirstOrDefault(), 
        LastSubmit = (from s in c.smsContactFormSents orderby s.sentDateTime descending select s.ACPForm).FirstOrDefault(), 
        lastFormComplete = (from s in c.smsContactFormSents orderby s.sentDateTime descending select s).FirstOrDefault(), 
        isMyContact = (from m in c.smsEmployeeContacts where m.empID == userID select m).Any() 
       }); 

    if (isCurrentYear) 
    { 
     var custs = (from c in emptyCustomers.ToList() 
        where c.ISCTBillingActive || c.ISFFDMBillingActive || c.IsMRIBillingActive || (c.IsPETBillingActive && c.custType != 2) 
        select new ACPListObject() 
        { 
         contact = new smsCustomerContact() { cntID = -1, smsCustomer = c, cntActive = true }, 
         Year = Year, 
         LastSentDate = new DateTime(), 
         LastSubmit = (ACPForm)null, 
         lastFormComplete = (smsContactFormSent)null, 
         isMyContact = false 
        }); 

     var combined = data.ToList(); 
     combined.AddRange(custs); 
     data = combined.AsQueryable();     

    } 
     else if (sortColumn == "DateSubmitted") 
    { 
     if (asc) 
     { 
      data = data.OrderBy(o => o.lastFormComplete.ACPForm.dateAccepted); 
     } 
     else 
     { 
      data = data.OrderByDescending(o => o.lastFormComplete.ACPForm.dateAccepted);      
     } 
    } 


    return data.ToList();   
} 

编辑 我想你提出的解决方案,我认为这是工作,但由于某种原因,又名不被填充“dateSubmitted”为dateAccepted值。

他们的方式,对象连接的代码来获取dateAccepted是这样的:

ACPListObject

 public class ACPListObject 
{ 
    public smsCustomerContact contact { get; set; } 
    public int Year { get; set; } 
    public DateTime LastSentDate { get; set; } 
    public ACPForm LastSubmit { get; set; } 
    public DateTime? dateAccepted { get; set; } 
    public smsContactFormSent lastFormComplete { get; set; } 
    public bool isMyContact { get; set; } 
} 

smsContactFormSent

public partial class smsContactFormSent 
{ 
    public System.Guid ID { get; set; } 
    public int cntID { get; set; } 
    public int sentBy { get; set; } 
    public System.DateTime sentDateTime { get; set; } 
    public bool completed { get; set; } 
    public Nullable<int> acpID { get; set; } 

    public virtual ACPForm ACPForm { get; set; } 
    public virtual smsCustomerContact smsCustomerContact { get; set; } 
    public virtual smsEmployee smsEmployee { get; set; } 
} 

public partial class ACPForm 
{ 
    public ACPForm() 
    { 
     this.ACPFormContacts = new HashSet<ACPFormContact>(); 
     this.smsContactFormSents = new HashSet<smsContactFormSent>(); 
    } 

    public int acpID { get; set; } 
    public int romID { get; set; } 
    public int customerID { get; set; } 
    public Nullable<System.DateTime> dateSent { get; set; } 
    public Nullable<System.DateTime> dateAccepted { get; set; } 

} 

难道是我没有得到值,因为我没有正确访问smsContactFormSent?

这是我如何实现您的解决方案:

public class ACPListObject 
{ 
    public smsCustomerContact contact { get; set; } 
    public int Year { get; set; } 
    public DateTime LastSentDate { get; set; } 
    public ACPForm LastSubmit { get; set; } 
    public DateTime? dateAccepted { get; set; } 
    public smsContactFormSent lastFormComplete { get; set; } 
    public bool isMyContact { get; set; } 
} 

      var data = (from c in starter 
        select new ACPListObject() 
        { 
         contact = c, 
         Year = Year, 
         LastSentDate = (from s in c.smsContactFormSents orderby s.sentDateTime descending select s.sentDateTime).FirstOrDefault(), 
         LastSubmit = (from s in c.smsContactFormSents orderby s.sentDateTime descending select s.ACPForm).FirstOrDefault(), 
         lastFormComplete = (from s in c.smsContactFormSents orderby s.sentDateTime descending select s).FirstOrDefault(), 
         dateAccepted = (from s in c.smsContactFormSents orderby s.sentDateTime descending select s.ACPForm.dateAccepted).FirstOrDefault(), //note that I am selecting dateAccept here so, this will be a DateTime or null       
         isMyContact = (from m in c.smsEmployeeContacts where m.empID == userID select m).Any() 
        }); 

      else if (sortColumn == "DateSubmitted") 
     { 
      if (asc) 
      { 
       //data = data.OrderBy(o => o.lastFormComplete.ACPForm.dateAccepted);     
       data = data.OrderBy(o => o.dateAccepted);//order by new variable 
      } 
      else 
      { 
       //data = data.OrderByDescending(o => o.lastFormComplete.ACPForm.dateAccepted);      
       data = data.OrderByDescending(o => o.dateAccepted); //order by new variable 
      } 
     } 

当一个新的ContactForm被发送,将不填充dateSubmitted值。我保持挖掘并查看错误是否来自其他地方。非常感谢你的帮助Marcos。

+0

可能o.lastFormComplete为null或o.lastFormComplete.ACPForm为null。如果dateAccepted为null,则不会抛出任何异常。 – 2014-11-22 01:01:48

+0

谢谢你的评论马科斯。你有什么我可以尝试补救例外的建议吗?非常感谢。 – 2014-11-22 01:49:05

+0

你可能只会得到o.lastFormComplete不为null并且o.lastFormComplete.ACPForm不为空的记录,但我不知道你是否想要这个:'data = data.Where(o => o.lastFormComplete!= null && o.lastFormComplete。ACPForm!= null).OrderBy(o => o.lastFormComplete.ACPForm.dateAccepted);' – 2014-11-22 01:53:03

回答

1

检查此解决方案并适应您的型号。

var data = (from c in starter 
        select new ACPListObject() 
        { 
         contact = c, 
         Year = Year, 
         LastSentDate = (from s in c.smsContactFormSents orderby s.sentDateTime descending select s.sentDateTime).FirstOrDefault(), 
         LastSubmit = (from s in c.smsContactFormSents orderby s.sentDateTime descending select s.ACPForm).FirstOrDefault(), 
         lastFormComplete = (from s in c.smsContactFormSents orderby s.sentDateTime descending select s).FirstOrDefault(), 
         dateAccepted = (from s in c.smsContactFormSents orderby s.sentDateTime descending select s.ACPForm.dateAccepted).FirstOrDefault(), //note that I am selecting dateAccept here so, this will be a DateTime or null 
         isMyContact = (from m in c.smsEmployeeContacts where m.empID == userID select m).Any() 
        }); 

     if (isCurrentYear) 
     { 
      var custs = (from c in emptyCustomers.ToList() 
         where c.ISCTBillingActive || c.ISFFDMBillingActive || c.IsMRIBillingActive || (c.IsPETBillingActive && c.custType != 2) 
         select new ACPListObject() 
         { 
          contact = new smsCustomerContact() { cntID = -1, smsCustomer = c, cntActive = true }, 
          Year = Year, 
          LastSentDate = new DateTime(), 
          LastSubmit = (ACPForm)null, 
          lastFormComplete = (smsContactFormSent)null, 
          isMyContact = false 
         }); 

      var combined = data.ToList(); 
      combined.AddRange(custs); 
      data = combined.AsQueryable();     

     } 
     else if (sortColumn == "DateSubmitted") 
     { 
      if (asc) 
      { 
       data = data.OrderBy(o => o.dateAccepted);//order by new variable 
      } 
      else 
      { 
       data = data.OrderByDescending(o => o.dateAccepted); //order by new variable 
      } 
     } 


     return data.ToList(); 

编辑: 您应该dateAccepted添加到ACPListObject类,如果有可能:

public class ACPListObject 
{ 
    public smsCustomerContact contact { get; set; } 
    public int Year { get; set; } 
    public DateTime LastSentDate { get; set; } 
    public ACPForm LastSubmit { get; set; } 
    public smsContactFormSent lastFormComplete { get; set; } 
    public bool isMyContact { get; set; } 
    public DateTime? dateAccepted { get; set; } 
} 

如果您不能添加该属性,那么这个解决无效。让我知道这是否适合你。

+0

霍拉马科斯。感谢您对代码的帮助。我不在计算机上,我可以尝试一下,看看它是否有效。只要我能够尝试一下,我会发一个帖子。谢谢 – 2014-11-22 15:17:06

+0

嗨,再次。我今天早些时候添加了一条评论,其中包含代码,以及我对这个提议的解决方案的一个问题。你是否删除了该代码?我再也看不到它了。谢谢。 – 2014-11-25 16:51:41

+0

我没有删除,在你自己的帖子中更新更清晰。 – 2014-11-25 17:32:31