2012-06-07 47 views
15

我该如何声明这样一个变量?声明一个空的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 

回答

33
IQueryable<type of p> fData = null; 

如果以后要使用该查询(中频后督察):

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:(也许哈克)

var fData = rData.Take(0); // should be cheap. 
+0

感谢的是,它确实帮助,请参阅我的编辑用于澄清 – Shai

+0

@ Shai:对于匿名类型来说,不太可能,但是可以通过稍微重构剩下的方法来部分完成。 – leppie

+0

@Shai:我已经在前面的评论中添加了一个我的意思。 – leppie

-1

你可以声明它作为一个IQueryable的代替a var。您无法将fData声明为var的原因是因为“var”需要在声明期间推断该类型。如果你提前知道类型,你可以声明它很好。

IQueryable fData = null; 

更妙的是,如果你知道p的类型,你可以把它与IQueryable的的一般形式的强类型:

IQueryable<type-of-p> fdata = null; 

请注意,此分配!如果你尝试使用它,你会得到一个空引用异常。如果你真的想要一个空的可查询对象,然后使用leppie的建议,并使用Enumerable.Empty()创建一个空的集合。 AsQueryable()方法链。

+0

我非常怀疑将会工作(甚至编译),除非你抛出'p'来反对。 – leppie

+0

你不需要把p转换成对象;一切都是.NET被隐式转换为对象。 – BTownTKD

+0

由于协方差,它可能在.NET 4下工作,但在.NET 3.5上肯定会失败。 – leppie

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