2011-05-16 26 views
13

Tipo di nuovo a linq,C# LINQ: come recuperare un singolo risultato

qual è il modo più semplice per recuperare un singolo risultato utilizzando linq?

esempio, la mia domanda

var query = 
    from c in db.productInfo 
    where c.flavor == "Classic Coke" && c.container == "Can" 
    select c.co2Target; 

deve restituire solo un singolo campo con un valore doppio. come faccio a tirarlo fuori dalla query? In passato avevo usato ExecuteScalar. Come lo faccio con linq? Vorrei preservare il suo tipo di dati

UPDATE:

Ecco dove mi trovo ora. Il problema è che la query im test di esecuzione qui sta tornando 4 invece di 3,75

var query = 
       (from a in db.LUT_ProductInfos 
       where a.flavor == "Classic Coke" && a.Container == "Can" 
       select new { a.co2High }).Single(); 

      double MyVar = query.co2High.Value; 

risposta

20

Penso che intendiate restituire un valore, non un record?Si avrebbe bisogno di fare select new {} come segue:

var query = 
    from c in db.productInfo 
    where c.flavor == "Classic Coke" && c.container == "Can" 
    select new { c.co2Target }; 

Poi se desideri solo per recuperare un singolo record così come quella:

var query = 
    (from c in db.productInfo 
    where c.flavor == "Classic Coke" && c.container == "Can" 
    select new { c.co2Target }).Single(); 

recupero sarebbe stato fatto come segue:

var query = 
     (from c in db.productInfo 
     where c.flavor == "Classic Coke" && c.container == "Can" 
     select new { c.co2Target }).Single(); 

double MyVar = query.co2Target; 
+0

Questa sintassi avvolge il risultato in un tipo anonimo, invece di restituire solo il valore. Non penso che questo sia ciò che l'OP intendeva. – Thorarin

+0

grazie ma hmm ... il risultato dovrebbe essere 3.75 ma il suo dandomi 4. Ho provato la formattazione tramite String.Format (query) ... qualche idea? EDIT: vedo il ragazzo sopra di me catturato – Sinaesthetic

+0

@Sinaes, quale tipo di campo è co2Target nel database, e come lo si recupera dalla query? –

11

Utilizzare i metodi di estensione .Single() o .SingleOrDefault().

var query = 
    (from c in db.productInfo 
    where c.flavor == "Classic Coke" && c.container == "Can" 
    select c.co2Target).Single(); 
7

Utilizzando First() o FirstOrDefault()

var query = 
    (from c in db.productInfo 
    where c.flavor == "Classic Coke" && c.container == "Can" 
    select c.co2Target).FirstOrDefault(); 

Utilizzare solo Single() o SingleOrDefault() se sai che c'è un solo risultato, o se si vuole fallire se ci sono più risultati.

5

È possibile utilizzare il metodo Single estensione:

var result = 
    (from c in db.productInfo 
    where c.flavor == "Classic Coke" && c.container == "Can" 
    select c.co2Target).Single(); 

Altri metodi di estensione correlati sono SingleOrDefault, First e FirstOrDefault.

La differenza tra Single e First è che Single genera un'eccezione se la query produce più di un risultato. Le variazioni OrDefault restituiranno null se nessun risultato è stato restituito dalla query, mentre Singolo e Primo lancio di un'eccezione non è alcun risultato esistente.

Se si utilizza Entity Framework 3.5, non supporta , quindi sarà necessario utilizzare First.

Un'altra cosa che vale la pena notare è che il codice originale ha generato un IQueryable<T>, il che significa che non esegue effettivamente la query finché non si valuta il risultato. L'utilizzo di uno qualsiasi di questi metodi di estensione impone l'esecuzione immediata della query.

2

utilizza SingleOrDefault() se la query restituisce sempre solo un elemento come risultato o verrà generata un'eccezione se il risultato della query è più di un elemento.

(from c in db.productInfo 
where c.flavor == "Classic Coke" && c.container == "Can" 
select c.co2Target).SingleOrDefault(); 

uso FirstOrDefualt() se il risultato più di un elemento e avete bisogno di uno qualsiasi dei poi.

(from c in db.productInfo 
where c.flavor == "Classic Coke" && c.container == "Can" 
select c.co2Target).FirstOrDefault(); 
-1

preferisco SingleOrDefault(), non genera un'eccezione se non viene restituito nulla. MSDN reference

questo modo si può fare un controllo condizione di salvaguardia per questi casi.

var query = (from c in db.productInfo where c.flavor == "Classic Coke" && c.container == "Can" 
       select c.co2Target).SingleOrDefault(); 
+5

Una volta un ragazzo ha passato tutto il mio codice e ha cambiato tutti i miei riferimenti da Single() a SingleOrDefault(). L'ho masticato per un'ora, perché SingleOrDefault può introdurre bug sottili di cui devi essere consapevole, mentre Single() genera un'eccezione se viene restituito più di un record (o nessun record). Utilizzare single quando dovrebbe esserci un singolo valore e solo un valore. È meglio lanciare un'eccezione piuttosto che lasciare passare un bug subletto. –

0
string str = (
    from c in db.productInfo 
    where c.flavor == "Classic Coke" && c.container == "Can" 
    select c.co2Target) 
    .Single().columnName; 
+1

Sarebbe utile aggiungere alcune informazioni aggiuntive sul motivo per cui la tua risposta risolve il problema – jeremy

+0

Aggiungi del testo esplicativo insieme al codice sopra riportato per rendere questa una risposta più utile. –

Problemi correlati