2013-06-24 78 views
2
无法访问IQueryable的项目

我是新来的c#。我试图使用linq查询生成的列表(?)来在排序表单上构建表。其中一部分包括在该列表中引用的特定项目如下:通过索引

using (CellOrderingDBEntities db = new CellOrderingDBEntities()) 
{ 
    var AccessoryItems = from AccessoryDescription in db.Accessories 
         join HardwareID in db.HardwareTypes 
          on AccessoryDescription.HardwareType equals HardwareID.HardwareID 
         where AccessoryDescription.DateRetired == null 
         select AccessoryDescription; 

    List<Device> DevicesList = (List<Device>)Session["DevicesList"]; 

    Guid AccessoriesOrder = (from ServiceID in db.TypeOfServices 
           where ServiceID.ServiceType == "Accessories Order" 
           select ServiceID.ServiceID).FirstOrDefault(); 

    //This Int is used to build the accessories table 
    int AccessoryRows = AccessoryItems.Count(); 

    if (SType == AccessoriesOrder) 
    { 
     for (int r = 0; r <= AccessoryRows; r++) 
     { 
      TableRow row = new TableRow(); 
      for (int c = 0; c < 3; c++) 
      { 
       TableCell cell = new TableCell(); 
       TextBox tb = new TextBox(); 
       int ai = 0; 
       int ri = 0; 

       tb.ID = "TextBoxRow_" + r + "Col_" + c; 
       if (c == 0) 
       { 
        cell.Controls.Add(tb); 
       } 
       else if (c == 1) 
       { 
        cell.Text = AccessoryItems[ai]; 
        ai++; 
       } 
      } 
     } 
    } 

我坚持这个错误,但:

 
Cannot apply indexing with [] to an expression of type 'System.Linq.IQueryable<Data.Accessory>' 

我试图将其转换为字符串,但对于名单原因我不明白为什么它不会让我通过索引访问IQueryable

+0

如果有人知道围绕类型包装我的头的好资源,我认为这是我没有得到的,因为我一直在抨击我的头,我会接受它。非常感谢! – Ischade

+0

您可能会发现使用以下语法会更容易:'foreach(AccessoryItems中的var ai)'而不是this:'for(int r = 0; r <= AccessoryRows; r ++)'如果您不需要'r'除了编制索引'AccessoryItems' – meataxe

+1

就好的LINQ资源而言:下载LINQPad(http://www.linqpad.net/)并随身携带。 (我也可以推荐使用J&B Albahari的C#4.0/5.0)。另外,我建议您了解本地(参见IEnumerable )和解释查询(参见IQueryable )和LINQ的延期执行模式。一旦你理解了这些概念,事情就会变得更加清晰。 – afrischke

回答

0

想通了:

    var AccessoryItems = from AccessoryDescription in db.Accessories 
            join HardwareID in db.HardwareTypes 
            on AccessoryDescription.HardwareType equals HardwareID.HardwareID 
            where AccessoryDescription.DateRetired == null 
            select AccessoryDescription; 

       List<Accessory> AIL = AccessoryItems.ToList(); 

这在for循环:

cell.Text = (string) AIL[ai].AccessoryDescription; 

和它的作品!

+1

此查询未指定订单,因此返回的项目没有以任何定义的顺序。索引这样一个集合并不是真正有意义的。这意味着这里有一个真正的设计缺陷。你可能根本不需要索引查询结果。 – Servy

+0

你能说明我的缺陷的性质吗?一旦查询运行顺序不应该改变,因为我遍历结果,并为我使用它,因为我不知道我需要的订单是具体的?非常感谢。 – Ischade

+1

如果您的目标仅仅是遍历整个结果集,那么您根本不需要按索引访问项目。如果这是您的目标,您可以使用'foreach'而不是'for'来访问所有项目。 – Servy

1

您可以使用ElementAt来访问序列中特定点上的元素。因此,更换:

cell.Text = AccessoryItems[ai]; 

cell.Text = AccessoryItems.ElementAt(ai) as String; 
+0

同样的问题。这只是得到这个错误。 :/ 无法将类型'Data.Accessory'隐式转换为'字符串' 它是实体框架之外的数据类型。 – Ischade

+0

您可以使用as关键字将类型转换为字符串吗? (即cell.Text = AccessoryItems.ElementAt(ai)as String;)注意:[“转换不可能,因为返回空值而不是引发异常”](http://msdn.microsoft.com/zh-cn/ us/library/vstudio/cscsdfbt.aspx),因此您可能需要检查空值。 – Brad

+0

我只是得到一个不同的错误。 无法通过引用转换,装箱转换,取消装箱转换,包装转换或空类型转换将类型'Data.Accessory'转换为'字符串' – Ischade