Codes DeCodes Ответов: 1

Как предотвратить потерю данных при использовании list< T & gt; Источник которого имеет тип iqueryable< T>


Я использую
IQueryable
и список. Это мой код :
<pre lang="C#">public ActionResult List(chap = false)
 {

IQueryable<UserInfo> userQuery = context.UserInfoes.Include("aspnet_Users")
                                   .Include("aspnet_Users.aspnet_Membership")
                                   .Include("Pshycologists").OrderBy(m => m.aspnet_Users.UserName);


List<UserInfo> userInfoList = new List<UserInfo>();
    UserInfo userInfoRow = new UserInfo();


var userQueryForChapter = userQuery.OrderBy(a => a.aspnet_Users.UserName);
                  foreach (var row in userQueryForChapter)
                  {
                      var stagesUserCompleted = (from au in db.aspnet_Users
                                                 join spu in db.StagePageUsers on new { UserId = au.UserId } equals new { UserId = (Guid)spu.UserId }
                                                 join sp in db.StagePages on new { StagePageId = (Int32)spu.StagePageId } equals new { StagePageId = sp.StagepageId }
                                                 join s in db.Stages on new { StageID = (Int32)sp.StageID } equals new { StageID = s.StageId }
                                                 where
                                                   au.UserId == row.UserId
                                                 select s
                          ).ToList();
                      if (stages.Count == stagesUserCompleted.Count)
                      {
                          userInfoRow = row;
                      }

                   userInfoList.Add(userInfoRow);

                  }

var users = userInfoList.ToPagedList(страница, 100);

ViewBag. searchKey = пользователь;
return View(пользователи);
}



При использовании этого кода я получаю ошибку в поле зрения. Ошибка заключается в следующем "
Object reference not set to an instance of an object.
Ошибка находится в этой строке
@item.aspnet_Users.UserName


Я предполагаю, что причина ошибки заключается в том, что я конвертируюсь из
IQueryable<UserInfo>

к
List<UserInfo>
. Это привело к потере стоимости aspnet_Users.имя пользователя. Как я могу преобразовать в список и все еще не потерять значение aspnet_Users.Имя пользователя ?? Я отладил и выяснил, что aspnet_Users.Имя пользователя равно null в строке var users = userInfoList.ToPagedList(страница, 100); (значение userInfoList.aspnet_Users.UserName-это null, где as-значение есть в userQuery.aspnet_Users.имя пользователя ).


Кто-нибудь поможет??

Что я уже пробовал:

Я добавил код var users = userInfoList.ToPagedList(страница, 100).AsQueryable (); чтобы сделать его как queryable, но я получил ошибку "элемент модели, переданный в словарь, имеет тип 'System.Linq.EnumerableQuery`1[Kats.DAL.UserInfo]', но для этого словаря требуется элемент модели типа 'PagedList.IPagedList`1[Kats. DAL. UserInfo]'."

Philippe Mori

Очевидно, что вы должны улучшить свои навыки отладки... На самом деле, как указано в решении 1, легко увидеть, что ваш код неправильно обрабатывает количество несоответствий. Поставив условную точку останова на линию, где userInfoRow если добавить его в список, а затем переместить текущую строку выполнения в первую строку цикла, то можно было бы найти проблему менее чем за минуту...

1 Ответов

Рейтинг:
11

Richard Deeming

Цитата:

if (stages.Count == stagesUserCompleted.Count)
{
    userInfoRow = row;
}

userInfoList.Add(userInfoRow);

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

Для первой строки запроса, если stages.Count != stagesUserCompleted.Count, вы добавляете пробел UserInfo запись в список. Ни одна из связанных сущностей не будет заполнена, поэтому, когда вы попытаетесь получить к ним доступ, вы получите NullReferenceException.

Для последующих строк, если stages.Count != stagesUserCompleted.Count, вы добавляете еще одну копию предыдущей строки. Мне это кажется неправильным.

Я подозреваю, что вы хотели сделать:
if (stages.Count == stagesUserCompleted.Count)
{
    userInfoList.Add(row);
}


Codes DeCodes

это была просто ошибка.. в любом случае спасибо