C# 声明一个空的可查询项?
如何声明这样一个变量C# 声明一个空的可查询项?,c#,linq,iqueryable,C#,Linq,Iqueryable,如何声明这样一个变量 var rData = from nc in ctx.NEWSLETTER_CLIENTS join ni in ctx.NEWSLETTER_INDICES on nc.INDEX_NUM equals ni.INDEX_NUM sele
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
更新3:(可能是黑客)
您可以将其声明为IQueryable而不是var。无法将fData声明为var的原因是“var”需要在声明期间推断类型。如果您提前知道类型,您可以声明它
IQueryable fData = null;
更好的是,如果您知道p的类型,可以使用IQueryable的一般形式使其成为强类型:
IQueryable<type-of-p> fdata = null;
IQueryable fdata=null;
请注意,这会指定null!如果您尝试使用它,您将得到一个空引用异常。如果您确实想要一个空的可查询对象,那么使用leppie的建议,并使用创建一个空集合。方法链。好的,下面的解决方案可能不好(甚至包含一些不必要的开销),但是,它可以工作:
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 => ...));
除非将
p
强制转换为object,否则我高度怀疑该函数是否有效(甚至编译);一切都是.NET隐式转换为对象。由于协变性,它可能在.NET 4下工作,但在.NET 3.5上肯定会失败。为此,它确实有帮助,请参阅我的编辑以获取详细信息clarification@Shai:对于匿名类型,不容易实现,但是可以通过对该方法的其余部分进行一点重构来部分完成。@Shai:我已经添加了一个示例,说明了我在前面的评论中的意思。谢谢-但这不会编译,因为RestOfMethod
不知道u
包含哪些成员…@Shai:你是对的,如果要对其进行进一步重构,将会很麻烦:(
IQueryable<T> RestOfMethod<T>(IQueryable<T> rData,
Expression<Func<T,bool>> pred1,
Expression<Func<T,bool>> pred2)
{ ... }
var fData = rData.Take(0); // should be cheap.
IQueryable fData = null;
IQueryable<type-of-p> fdata = null;
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 => ...));