С# LINQ: как получить один результат
Вид нового для linq,
Каков самый простой способ получить один результат с помощью linq?
пример, мой запрос
var query =
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target;
он должен возвращать только одно поле с двойным значением. как я вытащил его из запроса? Раньше я использовал ExecuteScalar. Как мне это сделать с помощью linq? Я хотел бы сохранить его тип данных
UPDATE:
Здесь, где я сейчас. Проблема в том, что тестовый запрос 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;
Ответы
Ответ 1
Я думаю, вы имеете в виду возврат одного значения, а не одну запись? Вам нужно будет сделать 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;
Ответ 2
Используйте методы расширения .Single()
или .SingleOrDefault()
.
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).Single();
Ответ 3
Используя First()
или FirstOrDefault()
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).FirstOrDefault();
Используйте только Single()
или SingleOrDefault()
, если вы знаете, что есть только один результат, или если вы хотите сбой, если есть несколько результатов.
Ответ 4
Вы можете использовать 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 выбрасывает исключение, если запрос приводит к нескольким результатам. Изменения OrDefault вернут null
, если запрос не будет возвращен, в то время как Single и First выдают исключение, результат не существует.
Если вы используете Entity Framework 3.5, он не поддерживает Single
, поэтому вам нужно будет использовать First
.
Еще одна вещь, которую стоит отметить, заключается в том, что ваш исходный код привел к IQueryable<T>
, что означает, что он фактически не выполняет запрос до тех пор, пока вы не оцените результат. Использование любого из этих методов расширения заставит запрос запускаться немедленно.
Ответ 5
msdn: SingleOrDefault
Использовать метод Single()
или SingleOrDefault()
для получения результата
Также проверьте: Стандартные методы расширения
Ответ 6
используйте 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();
Ответ 7
string str = (
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target)
.Single().columnName;
Ответ 8
Я предпочитаю SingleOrDefault(), он не генерирует исключение, если ничего не возвращается. Ссылка MSDN
таким образом вы можете сделать проверку состояния безопасности для такого случая.
var query = (from c in db.productInfo where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).SingleOrDefault();