使用linq查询集合时,它始终返回null

时间:2010-09-30 14:22:43

标签: c# linq collections

使用linq查询集合时,它总是返回null

Collection<JCTransLabour> oJCTransLabours = null;

oJCTransLabour = HttpContext.Current.Session["CurrentLabourTransactions"] as 
                                  Collection<JCTransLabour>;

// at this point the collection oJCTransLabours contains 3500 records

var oCurrentLabourTrans = from clt in oJCTransLabours
                          where clt.TransactionDate.Date != DateTime.Now.Date
                          select clt;

// at this point the collection oJCTransLabour = null
// I have tried to search on different fields 

return oCurrentLabourTrans;

我必须做错事。非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

我认为你只是混淆变量名称:

// You were missing an 's' before
oJCTransLabours = HttpContext.Current.Session["CurrentLabourTransactions"] 
                                    as Collection<JCTransLabour>;

答案 1 :(得分:1)

你的问题中至少有一个错字。
你在

之后说明了这一点
oJCTransLabour = HttpContext.Current.Session["CurrentLabourTransactions"] as Collection<JCTransLabour>;

oJCTransLabour不是空的,对吗?如果会话包含它,这是有意义的。

然后定义oCurrentLabourTrans并为其分配LINQ查询。然后你说那个

// at this point the collection oJCTransLabour = null

等等,它怎么能为空?你甚至没有修改它(它被oCurrentLabourTrans修改过)你只是说oJCTransLabour不是空的!

更新:我刚刚注意到名称中也有类型:您将其称为oJCTransLabours,然后将其称为oJCTransLabour。请发布完全代码,这样我们就不会对您错误输入的内容做出假设。

当然,LINQ表达式不能为空。 我认为oJCTransLabours很可能是空的,尽管你另有说明。

您认为这样的原因可能是因为您确定HttpContext.Current.Session["CurrentLabourTransactions"]不为空。确实如此,但您使用as运算符将值转换为Collection<JCTransLabour>。与转换运算符相反,如果类型不匹配,as不会抛出异常,它只返回null

您可能想尝试

oJCTransLabour = (Collection<JCTransLabour>)HttpContext.Current.Session["CurrentLabourTransactions"];

并查看是否出现任何错误。

答案 2 :(得分:0)

这看起来不像linq问题,而是会话中的值为null或不是Collection<JCTransLabour>

您可以通过将查找更改为:

来确保它不为null
oJCTransLabour = (HttpContext.Current.Session["CurrentLabourTransactions"] as Collection<JCTransLabour>) ?? new Collection<JCTransLabour>();

如果应该始终存在会话值,那么如果在执行查询之前未找到该值,则可以抛出异常。

答案 3 :(得分:0)

试试这个:

var oCurrentLabourTrans = (from clt in oJCTransLabours where clt.TransactionDate.Date != DateTime.Now.Date select clt).ToList();