#c# #linq
#c# #linq
Вопрос:
Я вызываю следующую функцию ниже в разных местах. В принципе, у меня есть список пользователей, который заполнен UserListItems. В этой ситуации это жестко запрограммированный список «Менеджеров». Я могу создать список менеджера нормально, но мне нужно запустить этот процесс, чтобы убедиться, что все обновлено. Были ли добавлены, удалены какие-либо менеджеры и т.д. Поэтому я сначала создаю список менеджеров из таблицы участников (это актуально). Затем я получаю список менеджеров, сохраненный в таблице UserList. Предполагается, что приведенный ниже предварительный запрос проверяет, есть ли в таблице членов дополнительные менеджеры, чем в списке пользователей. Если есть дополнительные, их следует добавить как userlistitems. Моя проблема в том, что когда я получаю возможность сохранить изменения, мне выдается следующая ошибка:
Не удается привести объект типа ‘System.Data.Entity.DynamicProxies.ApplicationUser …’для ввода’System.Строка’.
таблица UserListItem является всего лишь таблицей отношений и содержит поля
- UserListItemId
- UserListId
- Идентификатор пользователя
и оба идентификатора пользователя и UserListId, похоже, верны при отладке. Чего мне не хватает?
public void UpdateManagerList()
{
var member = GetUserMember();
var managerList = db.UserList.Where(u => u.Name == "Managers" amp;amp; u.OrgId == member.OrgId).FirstOrDefault();
var listId = managerList.O_UserListId;
// list and user ids for up to date managers.
List<O_Member> ManagersCur = db.O_MemberWhere(u => u.OrgId == member.OrgId amp;amp; u.Manage == true amp;amp; u.JoinedStored == true).ToList();
List<string> curUserIds = ManagersCur.Select(u => u.UserId).ToList();
//list of managers stored in userlist
List<UserListItem> ManagersList = db.UserListItem.Where(u => u.UserListId == listId).ToList();
List<string> listUserIds = ManagersList.Select(u => u.UserId).ToList();
foreach (var item in ManagersCur)
{
var mUser = ManagersList.Where(u => listUserIds.Contains(item.UserId)).FirstOrDefault();
if (mUser != null)
{
continue;
}
else
{
string userId = item.UserId;
UserListItem newUser = new UserListItem();
newUser.UserListId = listId;
newUser.UserId = userId;
db.UserListItem.Add(newUser);
db.SaveChanges();
}
}
Комментарии:
1. Ваш запрос mUser кажется мне очень забавным — ваше условие where не зависит от u, так почему бы вам просто не протестировать,
listUserIds.Contains(item.UserId)
например, сделайте свой тестif (!listUserIds.Contains(item.UserId))
, а затем добавьте UserListItem.2. Кроме того, почему вы делаете
.Include(o => i.UserList)
— предположительно, это данные, которые вы уже знаете и храните в managerList?3. И следует ли вам удалять менеджеров из списка, которые больше не назначены менеджерами для любого пользователя?
4. спасибо netmags, я проверю запрос. Я понимаю, что включение было ненужным, но я тестировал вещи и забыл удалить его. Кроме того, удаление менеджеров произойдет в другом foreach, но я убрал это для простоты решения этой проблемы.
5. Ваше первое предложение, если (!listUserIds. Содержит (элемент. userId)) как ни странно, я просматриваю первую запись, но затем я получаю ту же ошибку, что и выше, во второй записи. Что может быть причиной этого? Просто сводит меня с ума. Спасибо за помощь
Ответ №1:
Возможно, очистка вашего кода помогла бы?
public void UpdateManagerList() {
var member = GetUserMember();
var managerList = db.UserList.Where(u => u.Name == "Managers" amp;amp; u.OrgId == member.OrgId).FirstOrDefault();
var listId = managerList.O_UserListId;
// list and user ids for up to date managers.
List<O_Member> ManagersCur = db.O_MemberWhere(u => u.OrgId == member.OrgId amp;amp; u.Manage == true amp;amp; u.JoinedStored == true).ToList();
List<string> curUserIds = ManagersCur.Select(u => u.UserId).ToList();
//list of managers stored in userlist
List<UserListItem> ManagersList = db.UserListItem.Where(u => u.UserListId == listId).ToList();
List<string> listUserIds = ManagersList.Select(u => u.UserId).ToList();
foreach (var curMgrId in curUserIds) {
if (!listUserIds.Contains(curMgrId)) {
var newUserLI = new UserListItem();
newUserLI.UserListId = listId;
newUserLI.UserId = curMgrId;
db.UserListItem.Add(newUserLI);
db.SaveChanges();
}
}