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

Создание пустого IQueryable для использования с Linq в sql

Мне нужно иметь либо необязательный параметр в запросе Linq, либо иметь возможность назначить запрос var в чем-то вроде IF, если этот необязательный параметр нужно удалить из запроса.

Если я задаю запрос var внутри оператора IF, он сообщает мне, что var не существует в контексте, когда я пытаюсь его пропустить.

if (whichGroup == "All")
        {
            var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr
                                   select o
                                  );
        }
        else
        {
            var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr && o.Group == whichGroup
                                   select o
                                  );
        }

        foreach (var data in listOppLineData)  //listOppLineData doesn't exist here
        {

Мне нужно установить var перед оператором IF, я думаю, но я не знаю, что его установить.

var listOppLineData = ""; // gives me 
Cannot implicitly convert type 'System.Linq.IQueryable<Forecast.Models.opportunity_vw>' to 'string'

IQueryable listOppLineData = new IQueryable(); //gives me
        Cannot create an instance of the abstract class or interface 'System.Linq.IQueryable'
4b9b3361

Ответ 1

Попробуйте следующее:

IQueryable<opportunity_vw> listOppLineData;

Это определение переменной, но вы ожидаете ее инициализации.

Кроме того, глядя на ваш запрос, вы можете сделать все в одном, например:

var listOppLineData = (from o in db.opportunity_vws
                      where o.fiscal_yr_and_qtr == qtr && (o.Group == whichGroup || whichGroup == "All")
                      select o
                      );

Ответ 2

Попробуйте это. Вы можете создать общий тип с T или определенным типом, заменив T на ваше имя типа.

IQueryable listOppLineData = Enumerable.Empty<T>().AsQueryable()

Ответ 3

Ваша проблема в том, что когда вы объявляете переменную в С#, вы объявляете ее только в текущей области. Итак, если вы объявите переменную listOppLineData в блоке if, вы можете использовать ее только внутри этого блока, но не где-либо еще. (Вы можете определить другую переменную с тем же именем в другом блоке, но это будет совершенно другая переменная, поэтому у нее не будет значения, которое вы назначили первой переменной.)

Как вы уже выяснили, вам нужно объявить переменную вне блоков if.

Ваша первая попытка не сработала, потому что компилятор увидел, что вы явно не указали тип переменной (что делает var), и вы назначили переменную string. Таким образом, было установлено, что тип переменной string. И вы не можете назначить такую ​​переменную string, которая не является string.

Ваша вторая попытка не сработала, потому что вы не можете создать экземпляр интерфейса. (Если вы хотите создать экземпляр, это должен быть определенный тип, обычно класс.) И даже если вы исправили это, не-общий IQueryable не знает тип элементов в нем, поэтому foreach не будет работать.

Но вам не нужно присваивать значение переменной, так как она назначается в обеих ветвях if. И правильный тип здесь - общий IQueryable<T>, причем T является opportunity_vw. Это означает, что правильный код:

IQueryable<opportunity_vw> listOppLineData;

if (whichGroup == "All")
{
    listOppLineData = …;
}
else
{
    listOppLineData = …;
}

foreach (var data in listOppLineData)
{
    …
}

Если вы действительно хотели назначить какое-либо значение переменной (хотя здесь нет оснований делать это), вы можете использовать null (который не представляет значения):

IQueryable<opportunity_vw> listOppLineData = null;

Ответ 4

Попробуйте добавить .ToList();

var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr
                                   select o
                                  ).ToList();

Update

И исправить запрос.

Вам не нужно ничего перебирать без .ToList();

Head of of Butt Update

var listOppLineData = (from o in db.opportunity_vws
                      where (whichGroup == "All" || o.Group == whichGroup)
                      && (o.fiscal_yr_and_qtr == qtr)
                      select o);

Поместите свой "короткий" перед OR, так что вторая часть никогда не опускается, если не нужна. Я все равно использовал бы .ToList(), хотя.