2011-12-20 37 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")