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();