c# - inside - ¿Declarar un Queryable vacío?
public iqueryable (3)
Bueno, la siguiente solución podría ser mala (e incluso contener una sobrecarga no deseada), pero funciona:
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 => ...));
¿Cómo declaro tal variable?
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
Puede declararlo como un IQueryable en lugar de una var . La razón por la que no puede declarar fData como var es que "var" necesita inferir el tipo durante la declaración. Si conoce el tipo con anticipación, puede declararlo bien.
IQueryable fData = null;
Aún mejor, si conoce el tipo de p , puede hacer que esté fuertemente tipado con la forma genérica de IQueryable:
IQueryable<type-of-p> fdata = null;
Tenga en cuenta que esto asigna nulo ! Si intenta usarlo, obtendrá una excepción de referencia nula. Si realmente desea un objeto Queryable vacío , use la sugerencia de leppie y cree una colección vacía con Enumerable.Empty() . AsQueryable() método AsQueryable() .
IQueryable<type of p> fData = null;
Si desea utilizar la consulta más tarde (iow after the if):
var fData = Enumerable.Empty<type of p>().AsQueryable();
Actualizar:
Ahora para usar con tipos anónimos:
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);
Actualización 2:
Como se señaló, lo anterior no funciona realmente, ya que el predicado de Where
no conoce el tipo. Podría refactorizarlo un poco más para incluir los predicados en los parámetros, por ejemplo:
IQueryable<T> RestOfMethod<T>(IQueryable<T> rData,
Expression<Func<T,bool>> pred1,
Expression<Func<T,bool>> pred2)
{ ... }
Actualización 3: (quizás hacky)
var fData = rData.Take(0); // should be cheap.