Найти запись в dbSet с помощью Find без первичного ключа

У меня есть таблица пользователей:

Users:
 +ID
 +Username
 +...

Я хочу использовать myDBContext.Users.Find(Username) для закрытия пользователей. в моем текущем контексте я не могу использовать его идентификатор.

Мне нужно использовать полный запрос LINQ? например.

var user = from users in myDBContext.Users.Find(Username) 
           where users.Username == username
           select users

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

Свойства, указанные Главной ролью пользователя, должны быть точно идентичный ключу EntityType CamelotShiftManagementModel.User, на который ссылается Основная роль в ограничение отношений для отношений CamelotShiftManagementModel.AssociationUserFK1. Убедитесь, что все ключи свойства указаны в Принципале Роль. C:\Code\CamelotShiftManagement\CamelotShiftManagement\Models\CamelotDB.edmx 278 11 CamelotShiftManagement

Ответы

Ответ 1

Попробуйте,

User myUser = myDBContext.Users.SingleOrDefault(user => user.Username == username);

Используйте SingleOrDefault insted из Single. Если пользователь не существует, то Single выдаст ошибку. Пока SingleOrDefault вернет null, если пользователь не нашел иначе User объект будет возвращен.

Выбор между SingleOrDefault и FirstOrDefault

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

  • Оба возвращают только одно значение из коллекции/базы данных, если существуют другие значения по умолчанию.
  • Но если у вас несколько пользователей с одинаковым именем, и вы ожидаете получить исключение при выполнении запроса LINQ, используйте SingleOrDefault, поскольку он будет вызывать исключение, если доступно более одного элемента.
  • И если вы не хотите исключение и/или вы не хотите проверять, что ваша коллекция/база данных дублирует данные, просто хотите получить первое значение из коллекции/базы данных, а затем используйте FirstOrDefault для лучшего сравнения производительности до SingleOrDefault

FirstOrDefault

  • Обычно FirstOrDefault или First используется, когда нам требуется одиночное значение (сначала) из коллекции или базы данных.
  • В случае Fist/FirstOrDefault из базы данных извлекается только одна строка, поэтому она работает немного лучше, чем single/SingleOrDefault. такая небольшая разница едва заметна, но когда таблица содержит большое количество столбцов и строк, в это время производительность заметна.

Некоторые другие замечания

  • Если username является первичным ключом, то я думаю, что разница между значениями SingleOrDefault и FirstOrDefault не будет большой/нет, поскольку первичный ключ имеет индекс, а поиск в столбце индекса всегда будет быстрее обычного столбца.
  • Single или SingleOrDefault будет генерировать обычный TSQL, такой как "SELECT...".
  • Метод First или FirstOrDefault будет генерировать TSQL-статус, например "SELECT TOP 1..."

Ответ 2

Я нашел его:

User myUser = myDBContext.Users.Single(user => user.Username == i_Username);