Как сохранить результат запроса в переменную для того, что использовать дальше?

Не подскажите, как вот этот запрос к базе:

using (var entities = new Entities(PosConnectionString))
{
    var InfoCash = entities.GM_FinActStock
        .Where(terminal => terminal.TerminalID == TerminalId && terminal.BudgetArticle == 5637151398)
        .Select(cashnumber =>
            new {
                cashnumber = cashnumber.Amount
            })
        .FirstOrDefault();
}

Сохранить в переменную, чтобы потом использовать её дальше в коде?


Ответы (1 шт):

Автор решения: Alexander Petrov

Переменная имеет область видимости. Грубо говоря, она ограничена фигурными скобками, в которых находится эта переменная. То есть, InfoCash видна только внутри блока using.

Чтобы она была доступна после этого блока, нужно объявить её вне этого блока (перед ним):

? InfoCash;

using (var entities = new Entities(PosConnectionString))
{
    InfoCash = ...
}

// здесь InfoCash доступна

Знаком вопроса обозначен тип переменной. Какой тип задать? Тот, который возвращает ваш запрос. А именно, тип возвращаемый последним методом FirstOrDefault.

В вашем случае возвращается анонимный тип, который создан так: new { ... }. Создать переменную анонимного типа можно только с помощью ключевого слова var прямо по месту. В другом месте её объявить нельзя. Поэтому нужно избавиться от анонимного типа.

Создадим класс, который будет содержать нужную нам информацию:

class InfoCash
{
    public decimal Amount { get; set; }
}

Используем его в запросе:

InfoCash infoCash;

using (var entities = new Entities(PosConnectionString))
{
    infoCash = entities.GM_FinActStock
        .Where(terminal => terminal.TerminalID == TerminalId && terminal.BudgetArticle == 5637151398)
        .Select(cashnumber =>
            new InfoCash
            {
                Amount = cashnumber.Amount
            })
        .FirstOrDefault();
}

// здесь можно использовать infoCash

Однако, дополнительный класс нужен лишь в том случае, если возвращается несколько полей (колонок). А у вас всего одно поле. Поэтому достаточно переменной простого типа.

decimal amount;

using (var entities = new Entities(PosConnectionString))
{
    amount = entities.GM_FinActStock
        .Where(terminal => terminal.TerminalID == TerminalId && terminal.BudgetArticle == 5637151398)
        .Select(cashnumber => cashnumber.Amount)
        .FirstOrDefault();
}

Судя по названию Amount - это некая сумма, наверняка деньги. Если это действительно так, то тип должен быть decimal. Если у вас double/float - исправьте.


Запрос можно сократить до следующего:

amount = entities.GM_FinActStock
    .FirstOrDefault(terminal => terminal.TerminalID == TerminalId && terminal.BudgetArticle == 5637151398)
    .Amount;
→ Ссылка