2012-09-22 8 views
15

Ho una tabella utenti:Trova un record in dbSet utilizzando trovare senza una chiave primaria

Users: 
+ID 
+Username 
+... 

voglio usare myDBContext.Users.Find(Username) a pinna un utente. nel mio contesto attuale non posso usare il suo ID.

devo utilizzare una query LINQ completa? per esempio.

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

Ho anche cercato di definire il nome utente come chiave primaria nel mio edmx ma che ha provocato il seguente errore:

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

risposta

35

Prova con,

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

Utilizzare SingleOrDefault di Single. Se l'utente non esiste allora Single genererà un errore. Mentre SingleOrDefault restituirà null se l'utente non trova altrimenti l'oggetto User verrà restituito.

Selezione tra SingleOrDefault e FirstOrDefault

È possibile ottenere l'oggetto utente utilizzando SingleOrDefault e FirstOrDefault ma durante la selezione il metodo da utilizzare in considerazione sotto i punti.

  • Entrambi restituiscono un solo valore dalla raccolta/database se esiste altrimenti il ​​valore predefinito.
  • Ma se si dispone di più di un utente con lo stesso nome e si prevede di ottenere un'eccezione durante l'esecuzione della query LINQ, utilizzare SingleOrDefault in quanto genera un'eccezione se sono disponibili più elementi.
  • E se non si desidera un'eccezione e/o non si desidera controllare che la raccolta/il database abbia la duplicazione dei dati, si desidera ottenere il primo valore dalla raccolta/database quindi utilizzare FirstOrDefault per prestazioni migliori rispetto a SingleOrDefault

FirstOrDefault

  • Generalmente FirstOrDefault o First usato quando abbiamo richiesto singolo valore (prima) della collezione o database.
  • Nel caso di Fist/FirstOrDefault, viene recuperata una sola riga dal database in modo leggermente migliore rispetto a Single/SingleOrDefault. una differenza così piccola è appena percettibile, ma quando la tabella contiene un numero elevato di colonne e righe, in questo momento le prestazioni sono evidenti.

Alcune altre osservazioni

  • Se username è chiave primaria allora penso non ci sarà molta/nessuna differenza tra SingleOrDefault e FirstOrDefault performance come chiave primaria è indice e cercare colonna di indice sarà sempre essere più veloce della colonna normale.
  • Single o SingleOrDefault genererà un normale TSQL come "SELEZIONA ...".
  • Il metodo First o FirstOrDefault genererà lo statment TSQL come "SELECT TOP 1 ..."
+0

ancora meglio! .. Grazie. – Mortalus

+0

Non sarebbe meglio usare 'FirstOrDefault' invece? La mia comprensione del metodo 'SingleOrDefault' è che sfoglia la tabella * whole * per assicurarsi che solo un record corrisponda alla condizione. Potrebbe non essere ciò che l'OP vuole. – Crono

+1

@Crono Sì, hai ragione per FirstOrDefault se consideriamo le prestazioni di esso rispetto a SingleOrDefault. Ma qui penso che in base ai risultati attesi dovremmo fare una selezione tra questi due metodi. Se si desidera solo un singolo risultato e si prevede un'eccezione se esiste più di una sequenza di uguali, utilizzare SinleOrDefault altrimenti utilizzare FirstOrDefault. Aggiornerò la mia risposta con questo contesto. –

3

ho trovato:

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

Sì è ok, ma si dovrebbe accettare come risposta dal momento che è la soluzione per il vostro problema. –

+0

Beh, mi dice che posso solo accettarlo in due giorni, quindi aspetterò .. tnx – Mortalus

+0

@Mortalus trova la mia risposta se aiuta la tua domanda. Ho appena cambiato Single in SingleOrDefault. –

Problemi correlati