Создание пустого 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'
Ответы
Ответ 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(), хотя.