C# LINQ: как получить один результат
вид нового для linq,
каков самый простой способ получить один результат с помощью linq?
например, мой запрос
var query =
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target;
Она должна возвращать только одно поле с двойным значением. как я могу вытащить его из запроса? В прошлом я использовал ExecuteScalar. Как это сделать с linq? Я хотел бы сохранить его тип данных
обновление:
вот где я сейчас. Проблема в том, что тестовый запрос im, запущенный здесь, возвращает 4 вместо 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;
8 ответов
Я думаю, вы имеете в виду вернуть одно значение, а не одну запись? Вам нужно будет сделать select new {}
следующим образом:
var query =
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select new { c.co2Target };
тогда, если вы хотите получить только одну запись, а также это:
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select new { c.co2Target }).Single();
извлечение будет сделано следующим образом:
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select new { c.co2Target }).Single();
double MyVar = query.co2Target;
использовать .Single()
или .SingleOrDefault()
методы расширения.
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).Single();
С помощью First()
или FirstOrDefault()
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).FirstOrDefault();
использовать только Single()
или SingleOrDefault()
если вы знаете, что есть только один результат, или если вы хотите, чтобы потерпеть неудачу, если есть несколько результатов.
можно использовать Single
метод расширения:
var result =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).Single();
другие связанные методы расширения являются SingleOrDefault
, First
и FirstOrDefault
.
разница между Single и First заключается в том, что Single выдает исключение, если запрос приводит к более чем одному результату. The OrDefault вариации вернется null
если никакие результаты не были возвращены запросом, то пока одиночный и первый бросок исключением не существует.
если вы используете Entity Framework 3.5, он не поддерживает Single
, поэтому вам придется использовать First
.
еще одна вещь, стоит отметить, что ваш исходный код в результате IQueryable<T>
, что означает, что он фактически не выполняет запрос, пока вы не оценить результат. Использование любого из этих методов расширения приведет к немедленному запуску запроса.
в MSDN : SingleOrDefault
использовать Single()
или SingleOrDefault()
метод для получения результата
кроме того, проверить : методы расширения по умолчанию
использовать SingleOrDefault()
Если ваш запрос всегда возвращает только один элемент, как результат или исключение будет вызвано, если результат запроса более одного элемента.
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).SingleOrDefault();
использовать FirstOrDefualt()
Если ваш результат более одного элемента,и вам нужен любой из них.
(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;
Я предпочитаю SingleOrDefault (), он не выдает исключение, если ничего не возвращается. MSDN reference
таким образом, вы можете сделать проверку состояния safe-guard для такого случая.
var query = (from c in db.productInfo where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).SingleOrDefault();