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;
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;
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();
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.
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.
msdn: SingleOrDefault
Utilisez la méthode Single()
ou SingleOrDefault()
pour obtenir le résultat
Vérifiez également: méthodes d'extension par défaut
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();
string str = (
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target)
.Single().columnName;