问题
Kind of new to linq,
whats the simplest way to retrieve a single result using linq?
example, my query
var query =
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target;
it should only return a single field with a double value. how do i pull it out of query? In the past i had used ExecuteScalar. How do i do it with linq? I would like to preserve its data type
UPDATE:
Here's where I am now. The problem is that the test query im running here is returning 4 instead of 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;
回答1:
I think you mean return one value, not one record? You would need to do select new {}
as follows:
var query =
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select new { c.co2Target };
Then if you only want to retrieve a single record as well as that:
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select new { c.co2Target }).Single();
Retrieval would be done as follows:
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select new { c.co2Target }).Single();
double MyVar = query.co2Target;
回答2:
Use the .Single()
or .SingleOrDefault()
extension methods.
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).Single();
回答3:
By using First()
or FirstOrDefault()
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).FirstOrDefault();
Only use Single()
or SingleOrDefault()
if you know there is only one result, or if you want to fail if there are multiple results.
回答4:
You can use the Single extension method:
var result =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).Single();
Other related extension methods are SingleOrDefault, First and FirstOrDefault.
The difference between Single and First is that Single throws an exception if the query results in more than one result. The OrDefault variations will return null
if no results were returned by the query, while Single and First throw an exception is no result exists.
If you're using Entity Framework 3.5, it does not support Single
, so you will have to use First
.
One other thing worth noting is that your original code resulted in an IQueryable<T>
, which means it does not actually execute the query until you evaluate the result. Using any of these extension methods will force the query to run immediately.
回答5:
msdn : SingleOrDefault
Make use of Single()
or SingleOrDefault()
method to get result
Also check : Default Extension methods
回答6:
use SingleOrDefault()
if your query always returns only one element as result or exception will be thrown if the result of your query is more than one element.
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).SingleOrDefault();
use FirstOrDefualt()
if your result more than one element and you need any one of then.
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).FirstOrDefault();
回答7:
string str = (
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target)
.Single().columnName;
回答8:
i prefer SingleOrDefault(), it does not throw an exception if the nothing is returned. MSDN reference
this way you can do a safe-guard condition check for such case.
var query = (from c in db.productInfo where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).SingleOrDefault();
来源:https://stackoverflow.com/questions/6015081/c-sharp-linq-how-to-retrieve-a-single-result