Linq не выполняется должным образом

avatar
user2905416
8 апреля 2018 в 04:35
66
1
2

У меня есть функция для получения всех пользователей из таблицы с именами пользователей в базе данных, которая user_id не содержится в таблице user_ingroup, как показано ниже:

[Authorize]
public ActionResult DisplayUser(int? page, string groupId, string searchName, string searchPosition, string searchOffice)
{
        try
        {
            if (null == db)
            {
                db = new vien_kiem_soat_streammingEntities();
            }

            var UserIds = from p in db.user_ingroup.Where(p => p.group_id == groupId) select p.user_id;
            var users = db.users.Where(m => !UserIds.Contains(m.id));

            if (!String.IsNullOrEmpty(searchName))
            {
                ViewData["searchName"] = searchName;
                users = users.Where(us => us.full_name.ToLower().Contains(searchName.ToLower()));
            }

            if (!String.IsNullOrEmpty(searchPosition))
            {
                users = users.Where(us => us.position.Contains(searchPosition));
                ViewData["searchPosition"] = searchPosition;
            }

            if (!String.IsNullOrEmpty(searchOffice))
            {
                users = users.Where(us => us.office.Contains(searchOffice));
                ViewData["searchOffice"] = searchOffice;
            }

            ViewData["users"] = users.OrderBy(m => m.full_name).ToPagedList(page ?? 1, 2);

            var positions = from p in db.users.Where(p => !UserIds.Contains(p.id)) select p.position;
            List<string> pos = positions.Distinct().ToList();

            ViewData["positions"] = pos;
            ViewData["group"] = groupId;

            return View("DisplayUser");
        }
        catch (Exception ex)
        {
            return Redirect(Url.Action("Login", "Login", null));
        }
}

Все работает отлично, если все параметры, переданные этой функции, равны нулю, но если один из них имеет значение, функция возвращает всех пользователей, независимо от того, находится ли пользователь уже в группе или нет.

Кто-нибудь может объяснить мне, как это могло произойти и как это решить?

Источник
rahulaga_dev
8 апреля 2018 в 04:39
0

что вы имели в виду под Все работает отлично, если все параметры, которые передаются этой функции, равны нулю?

user2905416
8 апреля 2018 в 04:44
0

Я имел в виду, что если int? page = null и groupId = null и searchName = null и searchPosition = null и searchOffice = null Я получу всех пользователей в таблице с именами пользователей, но идентификаторы пользователей, которых я получаю, не содержатся в таблице «user_ingroup».

rahulaga_dev
8 апреля 2018 в 04:50
0

var users = db.users.Where(m => !UserIds.Contains(m.id)); дает вам пользователей, чей идентификатор отсутствует в user_ingroup правильно? ! это опечатка? поэтому, когда groupId имеет значение null, !UserIds.Contains(m.id) будет оцениваться как true для всех пользователей.

user2905416
8 апреля 2018 в 04:53
0

да.................!

user2905416
8 апреля 2018 в 05:04
0

Да, я забыл передать GroupId в каком-то случае. это работает сейчас.

Ответы (1)

avatar
rahulaga_dev
8 апреля 2018 в 04:56
1

Когда groupId равно null, UserIds.Contains(m.id) всегда будет оцениваться как false, и это то, что задумано. Следовательно, виновником здесь является оператор ! в строке ниже..

var users = db.users.Where(m => !UserIds.Contains(m.id));