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