如何声明这样的变量?
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
答案 0 :(得分:37)
IQueryable<type of p> fData = null;
如果您想稍后使用该查询(在if之后的iow):
var fData = Enumerable.Empty<type of p>().AsQueryable();
<强>更新强>
现在使用匿名类型:
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 :(也许是hacky)
var fData = rData.Take(0); // should be cheap.
答案 1 :(得分: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 => ...));
答案 2 :(得分:-1)
您可以将其声明为 IQueryable ,而不是 var 。您不能将fData声明为 var 的原因是因为“var”需要在声明期间推断出类型。如果您提前知道类型,可以声明它就好了。
IQueryable fData = null;
更好的是,如果你知道 p 的类型,你可以使用通用形式的IQueryable强力输入:
IQueryable<type-of-p> fdata = null;
请注意,这会指定 null !如果您尝试使用它,您将获得空引用异常。如果您确实需要空可查询对象,请使用leppie的建议,并使用Enumerable.Empty()。AsQueryable()方法链创建一个空集合。