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 => ...));