NebroProg Ответов: 2

Как использовать where в linq


Я хочу использовать where в linq
ошибка говорит, что не может неявно преобразовать тип string в xx.modules.Студенты

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

Students student = new Students();
int userId = Convert.ToInt16(InputAPIVM.USERID);
student = db.Students.Where(x => x.UserId == userId).ToString();

2 Ответов

Рейтинг:
8

NebroProg

int userId = Convert.ToInt16(InputAPIVM.USERID);

           student = db.Students.Where(x => x.UserId == userId).ToList();

           if (student != null)
           {
               foreach (Students s in student)
               {
                   s.lat_long = InputAPIVM.LAT_LONG;
                  }


Dave Kreskowiak

студент никогда не будет нулевым. Если нет записей для возврата, то звоните туда .ToList() создаст пустую коллекцию, а не null. Вам вообще не нужна проверка на ноль.

Рейтинг:
14

OriginalGriff

Это не так Where вот в чем проблема!
Вы заявили: student как Students переменная:

Students student = new Students();
Но ваш код преобразует всю возвращаемую коллекцию в строку:
db.Students.Where(x => x.UserId == userId).ToString()
и пытается присвоить эту строку student!

Первое, что вам нужно так это подумать о том, что вы хотите вернуть - и Where возвращает коллекцию элементов, а не один элемент. Вместо того, чтобы сказать, где именно, я бы предложил Метода firstordefault[^]:
student = db.Students.FirstOrDefault(x => x.UserId == userId);
Который возвращает одно значение (или null, если совпадений нет)
Это предполагает, что db.Students представляет собой коллекцию Student предметы!


NebroProg

Хорошо,
но этот запрос на обновление более одного столбца, потому что идентификатор пользователя является foreinkey
таким образом FirstOrDefault возвращает одну строку

OriginalGriff

Этот запрос ничего не обновляет!
Все, что он делает, это возвращает соответствующие строки; он не изменяет ни одну из них.

NebroProg

Я знаю, но я имею в виду, что этот код должен возвращать более одного столбца

OriginalGriff

Этот код не возвращает "столбцы" - он возвращает один экземпляр класса из коллекции. Если класс содержит интересующие вас "столбцы", то прекрасно. Иначе...

NebroProg

ладно,
если код будет таким
студент = дБ.студенты.FirstOrDefault(x => x.UserId == userId).Выберите(x =>x.UserId);
в чем же заключается ошибка

OriginalGriff

:вздыхать:
First или Default возвращает одно значение, а не коллекцию. Где возвращает коллекцию, а не одно значение.

Если вы хотите присвоить значение переменной - как показано в вашем примере кода - то вы хотите использовать FirstOrDefault.
Если вам нужно несколько значений, то вы используете Where.

Только коллекции могут быть обработаны методами Linq, поэтому, если вы возвращаете один элемент, вы не можете попытаться выбрать его идентификатор.
И - честно говоря - ваше значение ID очень маловероятно, чтобы быть студентом в любом случае; студент, вероятно, будет содержать значение ID, но это не будет так! И зачем вам пытаться выбрать значение идентификатора, если вы уже знаете его, потому что вы выбрали только те элементы, которые имеют определенное значение?
Попробуй

MyIDType studentID = db.Students.FirstOrDefault(x => x.UserId == userId).идентификатор пользователя;

Он может делать то, что вы хотите. Но... это то же самое, что сказать::

MyIDType studentID = userId;

У меня возникает определенное ощущение, что вы кодируете здесь "догадкой и надеждой": это не сработает. Вам нужно перестать гадать и начать думать о том, что вы пытаетесь сделать!

Maciej Los

5ed!