c # LINQ: как получить один результат - PullRequest
15 голосов
/ 16 мая 2011

новый для linq,

Какой самый простой способ получить один результат с помощью linq?

пример, мой запрос

var query =
     from c in db.productInfo
     where c.flavor == "Classic Coke" && c.container == "Can"
     select c.co2Target;

он должен возвращать только одно поле с двойным значением. как мне вытащить его из запроса? В прошлом я использовал ExecuteScalar. Как я могу сделать это с linq? Я хотел бы сохранить его тип данных

UPDATE:

Вот где я сейчас. Проблема в том, что выполняемый здесь тестовый запрос возвращает 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 ]

24 голосов
/ 16 мая 2011

Я думаю, вы имеете в виду вернуть одно значение, а не одну запись? Вам нужно будет сделать 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;
12 голосов
/ 16 мая 2011

Используйте методы расширения .Single() или .SingleOrDefault().

var query =
     (from c in db.productInfo
     where c.flavor == "Classic Coke" && c.container == "Can"
     select c.co2Target).Single();
8 голосов
/ 16 мая 2011

Используя First() или FirstOrDefault()

var query =
    (from c in db.productInfo
     where c.flavor == "Classic Coke" && c.container == "Can"
     select c.co2Target).FirstOrDefault();

Используйте Single() или SingleOrDefault(), только если вы знаете, что результат только один, или если вы хотите потерпеть неудачу, если есть несколько результатов.

5 голосов
/ 16 мая 2011

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

4 голосов
/ 16 мая 2011

msdn: SingleOrDefault

Используйте метод Single() или SingleOrDefault() для получения результата

Также проверьте: Методы расширения по умолчанию

2 голосов
/ 16 мая 2011

используйте 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();
1 голос
/ 19 ноября 2012
string str = (
  from c in db.productInfo 
  where c.flavor == "Classic Coke" && c.container == "Can"
  select c.co2Target)
    .Single().columnName;
0 голосов
/ 16 мая 2011

Я предпочитаю SingleOrDefault (), он не выдает исключение, если ничего не возвращается. MSDN, ссылка

таким образом, вы можете проверить состояние безопасности в таком случае.

var query = (from c in db.productInfo where c.flavor == "Classic Coke" && c.container == "Can"
                 select c.co2Target).SingleOrDefault();
...