2012-06-07 56 views
15

Làm cách nào để khai báo một biến như vậy?Khai báo một truy vấn trống?

  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 

Trả lời

33
IQueryable<type of p> fData = null; 

Nếu bạn muốn sử dụng các truy vấn sau (IOW sau if):

var fData = Enumerable.Empty<type of p>().AsQueryable(); 

Cập nhật:

Bây giờ cho việc sử dụng với các loại vô danh:

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

Cập nhật 2:

Như đã chỉ ra ở trên không thực sự hoạt động vì vị từ Where không biết loại. Bạn có thể cấu trúc lại nó một số chi tiết bao gồm các vị từ trong các tham số, ví dụ:

IQueryable<T> RestOfMethod<T>(IQueryable<T> rData, 
    Expression<Func<T,bool>> pred1, 
    Expression<Func<T,bool>> pred2) 
{ ... } 

Cập nhật 3: (có lẽ hacky)

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

Cảm ơn vì điều đó, nó sẽ giúp, xem chỉnh sửa của tôi cho một rõ – Shai

+0

@ Shai: Đối với các loại vô danh, không dễ dàng có thể, nhưng có thể được thực hiện một phần bằng cách tái cấu trúc lại phần còn lại của phương thức. – leppie

+0

@Shai: Tôi đã thêm một ví dụ về ý tôi trong bình luận trước của tôi. – leppie

-1

Bạn có thể khai báo nó như một IQueryable thay vì a var. Lý do bạn không thể khai báo fData là var là do "var" cần suy ra loại trong quá trình khai báo. Nếu bạn biết loại trước thời hạn, bạn có thể tuyên bố nó tốt.

IQueryable fData = null; 

Thậm chí tốt hơn, nếu bạn biết loại p, bạn có thể làm cho nó mạnh mẽ gõ với các hình thức chung của IQueryable:

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

Lưu ý rằng đây gán rỗng! Nếu bạn cố gắng sử dụng nó, bạn sẽ nhận được một ngoại lệ tham chiếu null. Nếu bạn thực sự muốn trống Đối tượng có thể truy vấn, sau đó sử dụng đề xuất của leppie và tạo bộ sưu tập trống bằng cách sử dụng Enumerable.Empty(). AsQueryable() chuỗi phương pháp.

+0

Tôi rất nghi ngờ sẽ làm việc (hoặc thậm chí biên dịch), trừ khi bạn cast 'p' để đối tượng. – leppie

+0

Bạn không cần phải cast p để đối tượng; mọi thứ đều được .NET chuyển đổi thành đối tượng. – BTownTKD

+0

Nó có thể hoạt động theo .NET 4 do hiệp phương sai, nhưng nó chắc chắn sẽ thất bại trên .NET 3.5. – leppie

2

Vâng, các giải pháp sau đây có thể là xấu (và thậm chí có một số chi phí không mong muốn), nhưng, nó hoạt động:

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 => ...)); 
Các vấn đề liên quan