Объявление пустой 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().