C# 无法按索引访问IQueryable的项

C# 无法按索引访问IQueryable的项,c#,iqueryable,C#,Iqueryable,我是c的新手。我试图使用linq查询生成的列表来在排序表单上构建一个表。其中一部分涉及引用该列表中的特定项目,如下所示: using (CellOrderingDBEntities db = new CellOrderingDBEntities()) { var AccessoryItems = from AccessoryDescription in db.Accessories join HardwareID in db.Hardwa

我是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 by索引

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

cell.Text = AccessoryItems[ai];

我想出来了:

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

而且它有效

如果有人知道一个很好的来源,可以让我把脑袋绕在类型上,我想这是我没有得到的,因为我一直在用脑袋撞这个,我会接受它。非常感谢!您可能会发现在AccessoryItems中使用以下语法更容易:foreach var ai而不是:for int r=0;r就好的LINQ资源而言:下载LINQPad并使用它。简而言之,我还可以推荐J.和B.Albahari btw的C4.0/5.0。我还建议您了解本地cf.IEnumerable和解释查询cf.IQueryable与LINQ的延迟执行模式之间的区别。一旦您理解了这些概念,事情就会变得更加清楚。Linq操作使用延迟执行,因此只在您请求时检索项目。通过索引访问一个项目意味着也要先阅读前面的所有项目,如果您多次这样做,这当然是非常低效的。如果您首先将项目加载到集合中,即通过在查询末尾附加.ToList或.ToArray,那么您可以通过索引访问项目。除了前面提到的C 4.0/5.0和LINQPad建议之外,我还建议您使用。同样的问题。这就得到了这个错误。:/无法将类型“Data.Accessment”隐式转换为“string”。它是实体框架之外的数据类型。能否使用as关键字将该类型转换为字符串?i、 e.cell.Text=AccessoryItems.ElementAtai作为字符串;注意:所以你可能需要检查空值。我只是得到一个不同的错误。无法通过引用转换、装箱转换、取消装箱转换、换行转换或空类型转换将类型“Data.Appendix”转换为“string”。由于附件类存在问题,Brad的答案仍然正确。如果您在您的附件类中,您将修复转换错误。没有您的帮助,编译器无法将您的类自动转换为字符串。此查询未指定顺序,因此返回的项没有任何定义的顺序。为这样一个集合编制索引并不是真正有意义的。这意味着这里有一个真正的设计缺陷;您可能根本不需要索引查询结果。您能为我解释一下缺陷的性质吗?一旦查询运行,顺序就不会随着我对结果的迭代而改变,对于我使用它的原因,我不确定我是否需要特定的顺序?非常感谢。如果您的目标只是遍历整个结果集,那么您就不需要通过索引访问项目。如果这是您的目标,您可以只使用foreach而不是for来访问所有项。我从阅读中了解到,在构建表时不能使用foreach循环?也就是说,我看到的所有示例都说使用for循环来实现它?实际上,我最初想使用foreach。谢谢你帮我理解这个@Servy!凉的谢谢你忍受了我肯定是无趣的问题。我会看看我是否能想出那样做的方法。这似乎是一个更好的方法。我如何给你代表,标记你的评论有用等。。。?
                    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();
cell.Text = (string) AIL[ai].AccessoryDescription;