2012-01-16 12 views
8

Ho la seguente query LINQ:Linq FirstOrDefault

Manager mngr = (from tr in DataContext.Manager 
        where tr.Name = "Jones").FirstOrDefault(); 

Come posso verificare se la query ha restituito 1 registro come io non posso fare Count per ottenere il conteggio.

+3

Consultare la documentazione per il metodo FirstOrDefault. Restituisce il valore predefinito per il tipo di dati se non ci sono risultati. Se è necessario che * non più di 1 * record superi i criteri della query, utilizzare invece SingleOrDefault. –

risposta

14

Prima di tutto, non è una query valida. Quando si utilizza la sintassi della query (from blah in blah ...), è necessario avere una clausola select. Dovrebbe essere più simile a:

var manager = 
    (from n in DataContext.Manager 
    where n.Name == "Jones" 
    select n).FirstOrDefault(); 

Per rispondere alla tua domanda, chiamando FirstOrDefault() sulla vostra query restituirà il primo risultato della query o il valore di default per il tipo (molto probabilmente null in questo caso). Per quello che stai andando, questo non sarà un uso adeguato in quanto la query può contenere più di un risultato.

Se si desidera verificare che la query restituisca un solo risultato, è necessario utilizzare il metodo SingleOrDefault(). Restituirà o l'articolo prodotto dalla query, il valore predefinito null se era vuoto o genera un'eccezione se c'era più di un articolo.

Se non si desidera generare un'eccezione, potrebbe essere più semplice inserire i primi due risultati in un elenco e verificare di averne uno solo.

var managers = 
    (from m in DataContext.Manager 
    where m.Name == "Jones" 
    select m).Take(2).ToList(); 
if (managers.Count == 1) 
{ 
    // success! 
    var manager = managers.First(); 
    // do something with manager 
} 
else 
{ 
    // error 
} 
+0

Il modo in cui l'ho fatto è stato dire se (mngr! = Null) {.. sappiamo che abbiamo ottenuto 1 contratto di locazione} –

+0

C'è anche un .Single() che controlla che hai ** esattamente ** un record – PPC

+0

- 1 per suggerire che il lancio dei risultati in una lista e il conteggio sarebbe una soluzione adeguata. Agire su set di risultati di grandi dimensioni o dove un grande tavolo deve essere attraversato per afferrare tutti i dati sarebbe molto negativo. Sia First che Single eseguono ottimizzazioni di back-end che non possono essere replicate con il tuo suggerimento. –

0

È possibile utilizzare il metodo di estensione SingleOrDefault per esprimere che la query deve sempre restituire un risultato.

Manager manager = (from tr in DataContext.Manager 
        where tr.ID = "2323").SingleOrDefault(); 

Tuttavia non si dice se hai 0 o più di 1.

0

Se si desidera contare i record, contare il risultato della query, senza FirstOrDefault.

var mngr = (from tr in DataContext.Manager 
       where tr.ID = "2323") 
if(mngr.Count() == 0) 
    .... 
else 
    Manager manager = mngr.First(); //No need for default since we know we have a record. 

È ancora possibile eseguire prima o il valore predefinito su mngr per ottenere il gestore specifico.

0

Si sta utilizzando un ID per la condizione where, penso che si dovrebbe aver già garantito che questa query restituisce solo un risultato.

Se il problema non ha alcun risultato, verificare l'utilizzo di FirstOrDefault() da MSDN title.

  int[] numbers = { }; 
      int first = numbers.FirstOrDefault(); 
      Console.WriteLine(first); 

      /* 
      This code produces the following output: 

      0 
      */ 
Problemi correlati