Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ to Sql为空,并抛出未设置为对象实例的对象引用。错误_C#_Linq To Sql_Asp.net Mvc 3 - Fatal编程技术网

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?根据你在原始帖子上的评论和这个答案,我意识到我从其他地方获取了这个控制器的代码。事实证明,我从来没有设置饼干。我是个大白痴。谢谢你的帮助。另外,感谢您提供有关将值指定给局部变量的指导。我总是在这两种方法之间左右为难。