Подтвердить что ты не робот

С# 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;
4b9b3361

Ответ 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>, что означает, что он фактически не выполняет запрос до тех пор, пока вы не оцените результат. Использование любого из этих методов расширения заставит запрос запускаться немедленно.

Ответ 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();