Объявление пустой Queryable?
Как объявить такую переменную?
var rData = from nc in ctx.NEWSLETTER_CLIENTS
join ni in ctx.NEWSLETTER_INDICES on nc.INDEX_NUM
equals ni.INDEX_NUM
select new
{
ClientID = nc.CLIENT_ID,
Email = nc.CLIENT_EMAIL_ADDRESS,
Index = nc.INDEX_NUM,
MainClass = ni.MAIN_CLASS,
SubClass = ni.SUB_CLASS,
App1 = ni.VALUE_1,
App2 = ni.VALUE_2,
App3 = ni.VALUE_3,
App4 = ni.VALUE_4
};
// Now I need to declare on a variable named fData under the function scope,
// so I can later use it:
var fData = ...; //What do I declare here?
if(x)
fData = fData.Concat(rData.Where(u => ...));
if(y)
fData = fData.Concat(rData.Where(u => ...));
// etc
Ответы
Ответ 1
IQueryable<type of p> fData = null;
Если вы хотите использовать запрос позже (ниже после if):
var fData = Enumerable.Empty<type of p>().AsQueryable();
Update:
Теперь для использования с анонимными типами:
IQueryable<T> RestOfMethod<T>(IQueryable<T> rData)
{
var fData = Enumerable.Empty<T>().AsQueryable(); // or = rData;
if(x)
fData = fData.Concat(rData.Where(u => ...));
if(y)
fData = fData.Concat(rData.Where(u => ...));
return fData;
}
// original code location
var rData = some query;
var fData = RestOfMethod(rData);
Обновление 2:
Как указано, вышесказанное не работает, так как предикат Where
не знает тип. Вы можете реорганизовать его еще несколько, чтобы включить предикаты в параметры, например:
IQueryable<T> RestOfMethod<T>(IQueryable<T> rData,
Expression<Func<T,bool>> pred1,
Expression<Func<T,bool>> pred2)
{ ... }
Обновление 3: (возможно, взломано)
var fData = rData.Take(0); // should be cheap.
Ответ 2
Хорошо, следующее решение может быть плохим (и даже содержать некоторые нежелательные служебные данные), но работает:
var fData = from p in rData
where 0 == 1
select p;
if(x)
fData = fData.Concat(rData.Where(u => ...));
if(y)
fData = fData.Concat(rData.Where(u => ...));
Ответ 3
Вы можете объявить его как IQueryable вместо var. Причина, по которой вы не можете объявить fData как var, заключается в том, что "var" необходимо вывести тип во время объявления. Если вы знаете тип раньше времени, вы можете объявить его просто отлично.
IQueryable fData = null;
Еще лучше, если вы знаете тип p, вы можете сделать его строго типизированным с помощью общей формы IQueryable:
IQueryable<type-of-p> fdata = null;
Обратите внимание, что это присваивает null! Если вы попытаетесь использовать его, вы получите исключение с нулевой ссылкой. Если вы действительно хотите пустой объект Queryable, тогда используйте предложение leppie и создайте пустую коллекцию, используя Enumerable.Empty(). Цепочка методов AsQueryable().