2012-09-22 18 views
15

Tengo una tabla de usuarios:Buscar un registro en dbSet encontrar sin el uso de una clave principal

Users: 
+ID 
+Username 
+... 

Quiero usar myDBContext.Users.Find(Username) a la aleta de un usuario. en mi contexto actual No puedo usar su ID.

¿Tengo que usar una consulta LINQ completa? p.ej.

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

También he tratado de definir el nombre de usuario como clave principal en mi edmx pero que resultó en el siguiente error:

Properties referred by the Principal Role User must be exactly identical to the key of the EntityType CamelotShiftManagementModel.User referred to by the Principal Role in the relationship constraint for Relationship CamelotShiftManagementModel.AssociationUserFK1. Make sure all the key properties are specified in the Principal Role. C:\Code\CamelotShiftManagement\CamelotShiftManagement\Models\CamelotDB.edmx 278 11 CamelotShiftManagement

Respuesta

35

Pruebe con,

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

Use SingleOrDefault insted de Single. Si el usuario no existe, entonces Single lanzará un error. Mientras SingleOrDefault devolverá null si el usuario no encuentra lo contrario User se devolverá el objeto.

Selección Entre SingleOrDefault y FirstOrDefault

Usted puede obtener el objeto de usuario mediante el uso de SingleOrDefault y FirstOrDefault pero mientras selecciona el método a utilizar considerar debajo de los puntos.

  • Ambos devuelven solo un valor de la colección/base de datos si existe el valor por defecto.
  • Pero si tiene más de un usuario con el mismo nombre y espera obtener una excepción mientras realiza una consulta LINQ, utilice SingleOrDefault ya que arrojará una excepción si hay más de un elemento disponible.
  • Y si no desea una excepción y/o no desea verificar que su colección/base de datos tenga duplicación de datos, solo quiere obtener el primer valor de la colección/base de datos luego use FirstOrDefault para un mejor rendimiento en comparación con SingleOrDefault

FirstOrDefault

  • Generalmente FirstOrDefault o First utilizado cuando que requiere solo valor (primera) de la colección o base de datos.
  • En el caso de Fist/FirstOrDefault, solo se recupera una fila de la base de datos por lo que funciona un poco mejor que single/SingleOrDefault. una diferencia tan pequeña apenas se nota, pero cuando la tabla contiene un gran número de columnas y filas, en este momento el rendimiento es notable.

Algunas otras observaciones

  • Si username es clave primaria, entonces creo que no habrá mucho/no hay diferencia entre SingleOrDefault y FirstOrDefault actuación como clave primaria ha indexar y buscar en la columna de índice será siempre ser más rápido que la columna normal.
  • Single o SingleOrDefault generará una TSQL regular como "SELECT ...".
  • El método First o FirstOrDefault generará el DECLARACIÓN TSQL como "SELECT TOP 1 ..."
+0

aún mejor! .. Gracias. – Mortalus

+0

¿No sería mejor usar 'FirstOrDefault' en su lugar? Mi comprensión del método 'SingleOrDefault' es que examinará la tabla * whole * para asegurarse de que solo un registro coincida con la condición. Puede que no sea lo que quiere el OP. – Crono

+1

@Crono Sí, tiene razón para FirstOrDefault si consideramos el rendimiento del mismo en comparación con SingleOrDefault. Pero aquí creo que dependiendo del resultado esperado deberíamos hacer la selección entre estos dos métodos. Si solo desea un resultado único y espera una excepción si hay más de una secuencia de la misma, utilice SinleOrDefault; de lo contrario, use FirstOrDefault. Actualizaré mi respuesta con este contexto. –

3

lo he encontrado:

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

Sí, está bien, pero debe aceptar como respuesta, ya que es la solución para su problema. –

+0

Bueno, me dice que solo puedo aceptarlo en dos días, así que esperaré ... tnx – Mortalus

+0

@Mortalus encuentra mi respuesta si te ayuda con tu pregunta. Acabo de cambiar Single a SingleOrDefault. –

Cuestiones relacionadas