2012-06-07 77 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 => ...));