2011-12-20 36 views
1

我有一個類返回數據庫中使用Linq to SQL(傳遞RegionName和RegionID變量)的區域列表。當我嘗試獲取其中的數據時出現問題。我可以在調試代碼時看到這些值(看起來像這樣:{RegionID = 1,RegionName =「Asia」})。這也是使用foreach循環來查看返回的每個項目/行時。如何查看從IEnumerable返回的對象?

任何想法如何分解這些,所以我可以抓住每個值?

這裏是正在使用LINQ聲明:

return (from r in db.Regions 
     join c in db.Countries on r.RegionID equals c.RegionId 
     join i in db.Programs on c.CountryID equals i.CountryID 
     select new { r.RegionID, r.RegionName }) 
     .Distinct(); 
+0

你能提供LINQ語句嗎? – Dessus 2011-12-20 00:52:27

+0

return(from r in db.Regions join c in db.Countries on r.RegionID equals c.RegionId join i in db.Programs on c.CountryID equals i.CountryID select new {r.RegionID,r.RegionName })。不同(); – Veaudoo 2011-12-20 01:13:08

回答

4

如果從一個方法到另一個退回所得序列,繼續和定義一個適當的類型。

public class RegionData // or whatever is appropriate 
{ 
    public int RegionID { get; set; } 
    public string RegionName { get; set; } 
} 

並修改查詢來選擇RegionData

select new RegionData 
{ 
     RegionID = r.RegionID, 
     RegionName = r.RegionName 
} 

而且你的方法應該返回IEnumerable<RegionData>。當你需要在其他地方順序循環在你的代碼

IEnumerable<RegionData> GetRegionData(/* parameter list */) { 

這將給予你的屬性編譯時訪問。匿名類型很有用,但是當你開始傳遞它們時,是時候把它們轉化爲一個定義的類型。

+0

我同意並喜歡這種方法,謝謝:)我試圖實現這一點成功,雖然...我得到一個錯誤,我修改我的查詢選擇RegionData:錯誤無法初始化類型'RegionDAO.RegionData'與集合初始值設定項,因爲它沒有實現'System.Collections.IEnumerable' – Veaudoo 2011-12-20 03:41:20

+0

'代碼'使用系統; using System.Collections.Generic; 使用System.Linq的; using System.Web;使用System.Collections的 ; public class RegionDAO { RegionDataContext db = new RegionDataContext(); 公共RegionDAO(){} 公共IEnumerable的 GetAllRegions()在db.Regions 將C在r.RegionID db.Countries等於 { 回報(從r c.RegionId 在db.Programs上加入我c.CountryID等於i.CountryID select new RegionData {r.RegionID,r.RegionName})。Distinct(); } }'code' – Veaudoo 2011-12-20 14:17:30

+0

'code' public class RegionData { public int RegionID {get;組; } public string RegionName {get;組; } }'code' – Veaudoo 2011-12-20 14:18:13

0

您有2個選擇:您可以獲取枚舉數,也可以迭代foreach。您的疑問:

(from r in db.Regions 
    join c in db.Countries on r.RegionID equals c.RegionId 
    join i in db.Programs on c.CountryID equals i.CountryID 
    select new { r.RegionID, r.RegionName }) 
    .Distinct(); 

正在創建一個匿名類型,你可以看看輕鬆只要你的方法或代碼塊的範圍內這樣做。

一旦你失去了範圍,你將不得不使用反射來查看匿名類型。在該方法的範圍內,您有以下選項:

選項1

var query = (from r in db.Regions 
      join c in db.Countries on r.RegionID equals c.RegionId 
      join i in db.Programs on c.CountryID equals i.CountryID 
      select new { r.RegionID, r.RegionName }) 
      .Distinct(); 

// get the enumerator 
var enumerator = query.GetEnumerator(); 
enumerator.Reset(); 

while(enumerator.MoveNext()){ 
    var obj = enumerator.Current; 
    // you can now use the query's anonymous properties 
} 

選項2

foreach(var obj in query){ 
    // much easier to access the properties 
} 

如果你要在方法的範圍之外去或者codeblock,像@AnthonyPeagram建議的那樣爲這些屬性創建一個類。

欲瞭解更多信息,請參閱MSDN: GetEnumerator

0

你返回一個匿名類型,但它被強制轉換爲object,阻止直接訪問它的使用。

你可以在這裏做幾件不同的事情。一種是爲這種情況創建一個類型:

public struct Region 
{ 
    public int RegionID{get; set;} 
    public string RegionName{get; set;} 
} 

然後在您的查詢中使用select new Region{r.RegionID, r.RegionName}。這使您可以返回IEnumerable<Region>IQueryable<Region>

您可以做的另一件事是將對象從枚舉轉換爲dynamic。然後你可以晚點打電話給這些成員。

最後,您可以使用基於反射的方法。玩PropertyInfo對象通常比在這裏值得多麻煩,但請注意,這是在DataBinder.Eval()後面的場景中使用,所以如果你使用Repeater或類似控件的枚舉,那麼你寫的代碼將工作正常與DataBinder.Eval(Container.DataItem, "RegionID")