Логическая проблема - изменение значения

Всем доброе утро.

У меня есть следующий метод, который я использую, чтобы попытаться вернуть логическое значение:

public static bool GetShowCatSubProdStatus(string memberid, string username)
    {
        MyEnts showcatsubprodstatus = new MyEnts.PDC_VDSOREntities35();

        var r = from p in showcatsubprodstatus.tblKeyAccountInfoes
                where p.MemberID == memberid && p.UserName == username
                select p.ShowCatSubProd;

        return r.Any();
    }

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

 bool showcatsubprodstatus = MyEnts.GetShowCatSubProdStatus(_memberid, _username);

        if (showcatsubprodstatus != true)
        {
            panCatSubProd.Visible = false;
        }

Может кто-нибудь объяснить, что здесь происходит и как я могу решить эту головоломку?!

PS: Извиняюсь за толстоту.

РЕДАКТИРОВАТЬ - Правильно, сузил его до переменной. Всегда возвращается «истина» независимо от результата метода?!?!


person Ricardo Deano    schedule 28.09.2010    source источник
comment
Можете ли вы подтвердить, что это область переменная (а не поле). Кроме того, используете ли вы showcatsubprodstatus где-либо еще, в частности, в лямбда-выражении, выражении LINQ или анонимном методе?   -  person Marc Gravell    schedule 28.09.2010
comment
Привет, Марк. Да, это переменная, и, кроме приведенного выше оператора if, showcatsubprodstatus больше нигде не используется.   -  person Ricardo Deano    schedule 28.09.2010


Ответы (1)


Этот фрагмент кода возвращает IEnumerable<bool> :

var r = from p in showcatsubprodstatus.tblKeyAccountInfoes
        where p.MemberID == memberid && p.UserName == username
        select p.ShowCatSubProd;

Вызывая .Any(), вы спрашиваете, есть ли какие-либо элементы в IEnumerable. Если есть, вы возвращаете true;

Вот почему вы всегда получаете верный ответ, потому что он всегда что-то находит.

Решение
Либо вы вызываете .SingleOrDefault(), который возвращает единственный существующий элемент (если он есть), либо возвращает значение по умолчанию для этого типа.

var r = from p in showcatsubprodstatus.tblKeyAccountInfoes
        where p.MemberID == memberid && p.UserName == username
        select p.ShowCatSubProd;
return r.SingleOrDefault(); //assuming p.ShowCatSubProd is a bool and not a Nullable<bool> else you need to adjust your return type or cast it to a boolean using .GetValueOrDefault().
person Peter    schedule 28.09.2010
comment
Я люблю тебя, Питер, и хочу от тебя детей :D - person Ricardo Deano; 28.09.2010
comment
Мне пришлось использовать return r.FirstOrDefault().GetValueOrDefault(); однако, поскольку я использую LNQ для Entities, который не очень хорошо ладит с Single/SingleorDefault. - person Ricardo Deano; 28.09.2010
comment
пожалуйста :-) Там, где я работаю, мы называем такие вещи «проверкой работоспособности», и мы просим сидящего рядом коллегу прочитать код, чтобы обнаружить подобные вещи. - person Peter; 28.09.2010