Linq to SQL «Выберите, где» проблема (WPF C # 4.0) - PullRequest
0 голосов
/ 13 июля 2011

Я много раз использовал linq to sql, чтобы он работал правильно, но сегодня что-то не так

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

public void GetPassword(int id) 
    {
        using (HProDataContext db = new HProDataContext())
        {
            _CurrentPassword = (from p in db.users
                                    where p.id == _CurrentID
                                    select p.password).ToString();
        }
    }

вот как я использую этот метод

private void btnOK_Click(object sender, RoutedEventArgs e)
    {
        if (listView1.SelectedItems.Count < 1)
        {
            MessageBox.Show("Please Select User");
        }
        else if (listView1.SelectedItems.Count > 1)
        {
            MessageBox.Show("Please Select Only One User");
        }
        else
        {
            _CurrentID = Convert.ToInt32(listView1.SelectedValue);
            GetPassword(_CurrentID);

            if (PasswordBox.Password == _CurrentPassword)
            {
                MessageBox.Show("You r in");
            }
            else
            {
                //MessageBox.Show("Password Is incorrect, please try again");
                MessageBox.Show(_CurrentPassword);
            }

        }

    }

enter image description here

Ответы [ 4 ]

4 голосов
/ 13 июля 2011

Вы пропускаете вызов SingleOrDefault или вызов Single, First или FirstOrDefault:

_CurrentPassword = (from p in db.users
                    where p.id == _CurrentID
                    select p.password).Single().ToString();

Объяснение: Ваш запрос возвращает IEnumerable<string>, даже если возвращен только один элемент. Сначала вам нужно получить этот предмет, прежде чем вы сможете сделать разумный звонок на ToString(). Кстати: я думаю, что вызов ToString() не нужен, потому что p.password уже должен быть строкой.

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

Похоже, вы делаете ToString() в выражении LINQ, а не в пароле. Можете ли вы попробовать удалить .ToString() в GetPassword?

Кроме того, как кто-то еще указал, вам нужно выбрать одно значение из перечисляемого - SingleOrDefault() должно сработать.

1 голос
/ 13 июля 2011

Что вы делаете, это конвертируете то, что находится внутри запроса linq, в строку, а не в результат запроса. Вы можете

попробуй

_CurrentPassword = (from p in db.users 
                    where p.id == _CurrentID 
                    select p.password).FirstOrDefault().ToString();

или

_CurrentPassword = (from p in db.users 
                    where p.id == _CurrentID 
                    select p.password).SingleOrDefault().ToString();

Пожалуйста, обратитесь к этим вопросам и ответам, чтобы выбрать между Single(), SingleOrDefault(), First(), FirstOrDefault().

Когда использовать .First и когда использовать .FirstOrDefault с LINQ?

и

LINQ: Когда использовать SingleOrDefault или FirstOrDefault () с критериями фильтрации

1 голос
/ 13 июля 2011

Результат выражения:

from p in db.users
  where p.id == _CurrentID
  select p.password

это IQueryable<string>, а не string (при условии p.password это string). Используйте .First() или другой метод, чтобы просто выбрать один элемент из запрашиваемой коллекции.

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