web-dev-qa-db-fra.com

c # LINQ: comment récupérer un seul résultat

Un peu nouveau pour linq,

quel est le moyen le plus simple de récupérer un seul résultat en utilisant linq?

exemple, ma requête

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

il ne doit renvoyer qu'un seul champ avec une valeur double. comment puis-je le retirer de la requête? Dans le passé, j'avais utilisé ExecuteScalar. Comment faire avec linq? Je souhaite conserver son type de données

METTRE À JOUR:

Voici où j'en suis maintenant. Le problème est que la requête de test im exécutée ici renvoie 4 au lieu de 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;
15
Sinaesthetic

Je pense que vous voulez dire retourner une valeur, pas un enregistrement? Vous devez faire select new {} comme suit:

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

Ensuite, si vous ne souhaitez récupérer qu'un seul enregistrement ainsi que celui-ci:

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

La récupération se ferait comme suit:

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

double MyVar = query.co2Target;
25
Tom Gullen

Utilisez les méthodes d'extension .Single() ou .SingleOrDefault().

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

En utilisant First() ou FirstOrDefault()

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

N'utilisez Single() ou SingleOrDefault() que si vous savez qu'il n'y a qu'un seul résultat, ou si vous voulez échouer s'il y a plusieurs résultats.

9
SirViver

Vous pouvez utiliser la méthode d'extension Single :

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

Les autres méthodes d'extension associées sont SingleOrDefault , First et FirstOrDefault .

La différence entre Single et First est que Single lève une exception si la requête aboutit à plusieurs résultats. Les variations OrDefault renverront null si aucun résultat n'a été renvoyé par la requête, tandis que Single et First lèvent une exception si aucun résultat n'existe.

Si vous utilisez Entity Framework 3.5, il ne prend pas en charge Single, vous devrez donc utiliser First.

Une autre chose à noter est que votre code d'origine a entraîné un IQueryable<T>, ce qui signifie qu'il n'exécute pas réellement la requête tant que vous n'avez pas évalué le résultat. L'utilisation de l'une de ces méthodes d'extension force l'exécution immédiate de la requête.

5
Thorarin

msdn: SingleOrDefault

Utilisez la méthode Single() ou SingleOrDefault() pour obtenir le résultat

Vérifiez également: méthodes d'extension par défaut

4
Pranay Rana

utilisez SingleOrDefault() si votre requête ne renvoie toujours qu'un seul élément car le résultat ou une exception sera levée si le résultat de votre requête est composé de plusieurs éléments.

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

utilisez FirstOrDefualt() si votre résultat contient plusieurs éléments et que vous en avez besoin.

(from c in db.productInfo
 where c.flavor == "Classic Coke" && c.container == "Can"
 select c.co2Target).FirstOrDefault();
2
mBotros
string str = (
  from c in db.productInfo 
  where c.flavor == "Classic Coke" && c.container == "Can"
  select c.co2Target)
    .Single().columnName;
1
Asif Rehman