LINQ to Sql пуст и выбрасывает ссылку на объект, не установленную для экземпляра объекта.ошибка - PullRequest
1 голос
/ 26 июля 2011

Я использую следующий запрос для получения набора результатов

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
}

, он выдает ссылку на объект, а не ошибку установки.Это выполняется в приложении MVC 3.

Однако, когда оно запускается в консольном приложении, оно запускается без проблем;это просто не возвращает результатов.Я пытался использовать DefaultIfEmpty, но просто не могу найти ничего, что объясняет, как использовать это с анонимными типами.

Итак ... мой подход правильный?Если нет, то что мне делать по-другому?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 26 июля 2011

Я не знаю, является ли это вашей проблемой, но ваш синтаксис соединения действительно странный.

Вам не нужно создавать анонимные типы здесь, просто сравните напрямую.

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
1 голос
/ 26 июля 2011

На ваш первый вопрос, вы соответственно обеспокоены тем, насколько грязным является linq ... мы часто берем грязный linq и просто делаем dataContext.ExecuteQuery или .ExecuteCommand, потому что одним из основных недостатков linq является их способность оптимизировать комплекс.запросов, как вы могли.

Чтобы получить представление о том, насколько плохо linq испортил ваш запрос, запустите его через анализатор запросов и сравните его с тем, с чего вы начали ... Я предполагаю, что он будетбыть смешным!

0 голосов
/ 26 июля 2011

Ну, во-первых, я уверен, что вы можете упростить первые несколько строк до:

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.Cookies работает в консольном приложении?)

0 голосов
/ 26 июля 2011

ICBW, но я бы попробовал наложить наложения, что-то вроде:

foreach(OverlapType overlap in overlaps as IEnumerable<OverlapType>)
{ 
    //stuff
}

Это, конечно, означает, что вам нужно будет создать модель объекта, который вы получаете из базы данных. Но на самом деле у вас должен быть тот или иной, то есть вся предпосылка MVC ( Модель View Controller)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...