C# LINQ to Sql为空,并抛出未设置为对象实例的对象引用。错误
我使用以下查询来获取结果集C# LINQ to Sql为空,并抛出未设置为对象实例的对象引用。错误,c#,linq-to-sql,asp.net-mvc-3,C#,Linq To Sql,Asp.net Mvc 3,我使用以下查询来获取结果集 var overlaps = from s in db.signups join u in db.users on new { userid = s.userid } equals new { userid = u.studentid } join a in db.activities on new { activityid = s.activityid } equals new { activity
var overlaps = from s in db.signups
join u in db.users on new { userid = s.userid } equals new { userid = u.studentid }
join a in db.activities on new { activityid = s.activityid } equals new { activityid = a.id }
where
s.userid != Convert.ToInt32(Request.Cookies["studentid"].Value) &&
(from signups in db.signups
where
signups.userid == Convert.ToInt32(Request.Cookies["studentid"].Value)
select new
{
signups.activityid
}).Contains(new { s.activityid })
orderby
u.studentid
select new
{
a.name,
u.firstname,
u.lastname,
u.studentid,
u.email
};
我对LINQ非常陌生,所以我实际上编写了Sql,然后使用Linqer生成LINQ,所以如果这可以更有效地完成,请告诉我。尽管如此,这不是问题所在
问题是当我这么做的时候
foreach(var overlap in overlaps)
{
//do something
}
它抛出对象引用未设置错误。这是在MVC3应用程序中运行的
但是,当它在控制台应用程序中运行时,它不会出现问题;它只是不返回任何结果。我尝试过使用DefaultIfEmpty,但就是找不到任何解决如何将其用于匿名类型的方法
所以
... 我的方法正确吗?
如果没有,我应该做什么不同的事情
提前谢谢。我不知道这是否是您的问题,但您的连接语法真的很奇怪 您不必在这里构建匿名类型,只需直接比较即可
join u in db.users on s.userid equals u.studentid
join a in db.activities on s.activityid equals a.id
与此相同:
select new
{
signups.activityid
}).Contains(new { s.activityid })
可以是:
select signups.activityid).Contains(s.activityid)
你到底为什么要重复所有的工作,把cookie参数反复转换成int
var studentId = Convert.ToInt32(Request.Cookies["studentid"].Value);
//use this instead now in the query, dont repeat yourself
ICBW,但我会尝试转换重叠,比如:
foreach(OverlapType overlap in overlaps as IEnumerable<OverlapType>)
{
//stuff
}
当然,这意味着您需要为从数据库中获取的对象创建一个模型。但实际上,无论如何,您都应该有一个,这是MVC Model View Controller背后的全部前提。首先,我很确定您可以将前几行简化为:
from s in db.signups
join u in db.users on s.userid equals u.studentid
join a in db.activities on s.activityid equals a.id
事实上,如果您已经在这些属性上定义了外键,那么根本不需要连接-LINQ将自动为您处理它们:写入s.User.firstname而不是u.firstname等
至于您的主要问题,请检查该查询的所有组件,主要是db和Request,以及Request.Cookie在控制台应用程序中究竟是如何工作的?对于第一个问题,您适当地担心linq有多混乱。。。我们通常使用凌乱的linq,只需执行dataContext.ExecuteQuery或.ExecuteCommand,因为linq的一个主要缺点是能够尽可能优化复杂查询
要了解linq对您的查询的处理有多糟糕,请通过查询分析器运行它,并将其与您开始使用的进行比较。。。我猜这会很滑稽 问题在你的LINQ声明中。其中的一个对象导致了异常。只是当您点击foreach时,LINQ被执行。@Hexxagonal我猜是查询字符串参数。哈哈哈!接得好,谢谢。请求。Cookie被替换为一个ID,比如说,0。db是数据上下文。你是说如果db有FKs,那么我就不需要这些连接了?我只是从db.signups中的s执行一些操作,其中选择s.users.firstname?根据你在原始帖子上的评论和这个答案,我意识到我从其他地方获取了这个控制器的代码。事实证明,我从来没有设置饼干。我是个大白痴。谢谢你的帮助。另外,感谢您提供有关将值指定给局部变量的指导。我总是在这两种方法之间左右为难。