将LINQ中的数据分配给ArrayList

本文关键字:分配 ArrayList 数据 LINQ | 更新日期: 2023-09-27 18:25:53

无法强制转换'<>类型的对象f_AnonymousType0`7[System.Int32,System.String,System.String

我对c很陌生#这里有人能告诉我这个代码有什么问题吗?

当我需要从LINQ到SQL获取记录并使用ArrayList将其显示给浏览器时,AnonymousType0。

请参阅代码

    using System;
    using System.Collections; // so you can use ArrayList.
    using System.Text; // so you can use StringBuilder.
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
namespace myWebApplication
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            showProducts();
        }
        private void showProducts()
        {
            dbDataContext db = new dbDataContext();
            var products = from p in db.tblmyWebsites
                           select p ;
            GridView1.DataSource = products;
            GridView1.DataBind();
            // the way to convert LINQ query to ArrayList
            ArrayList myArrList = new ArrayList();
            myArrList.AddRange((from p in db.tblmyWebsites
                                select new
                                {
                                    p.Id,
                                    p.productName,
                                    p.tblprogrammingLanguage.programmingLanguage, 
                                    p.tblapplicationType.applicationType,
                                    p.image,
                                    p.review, 
                                    p.price}).ToList());
            // StringBuilder Represents a mutable string of characters.
            StringBuilder sb = new StringBuilder();
            foreach (tblmyWebsite myProduct in myArrList)
            {
                sb.Append(string.Format(@"<table class = 'coffeeTable'>

                       <tr>
                           <th>Id: </th>
                           <td>{1}</td>
                       </tr>
                       <tr>
                           <th>productName: </th>
                           <td>{2}</td>
                       </tr>
                       <tr>
                           <th>programmingLanguage: </th>
                           <td>{3}</td>
                       </tr>
                       <tr>
                           <th>type: </th>
                           <td>{4}</td>
                       </tr>
                        <tr>
                           <th>image: </th>
                           <td>{5}</td>
                       </tr>
                       <tr>
                           <th>review: </th>
                           <td>{6}</td>
                       </tr>
                       <tr>
                           <th>price: </th>
                           <td>{7}</td>
                       </tr>
                       </table> ", myProduct.Id, myProduct.productName, myProduct.programmingLanguage, myProduct.type,
                                 myProduct.image, myProduct.review, myProduct.price).ToString());
            }
        }
    }
}

将LINQ中的数据分配给ArrayList

您在这里用匿名类型填充数组列表:

myArrList.AddRange((from p in db.tblmyWebsites
                            select new
                            {
                                p.Id,
                                p.productName,
                                p.tblprogrammingLanguage.programmingLanguage, 
                                p.tblapplicationType.applicationType,
                                p.image,
                                p.review, 
                                p.price}).ToList());

但你试着这样做:

foreach (tblmyWebsite myProduct in myArrList)

您的数组列表不包含tblmyWebsite对象,它包含匿名类型。即使它们有相同的字段和相同的名称,它也不会自动为您转换它们。我的假设是tblmyWebsite是从数据库中获得的(换句话说,db.tblmyWebsites是tblmyWebsite对象的集合)。所以你能做的很简单:

myArrList.AddRange(db.tblmyWebsites);    // your array list is now populated with 
                                         // tblmyWebsite objects 

没有必要使用select,除非您确实需要更改或重新映射某些内容。使用ArrayList也没有什么实际意义,通用List<T>更容易使用。事实上,你可以这样做:

 foreach (var myProduct in db.tblmyWebsites)

不需要ArrayList。只需在foreach中使用查询即可。

var stuff = from p in db.tblmyWebsites
            select new
            {
                p.Id,
                p.productName,
                p.tblprogrammingLanguage.programmingLanguage, 
                p.tblapplicationType.applicationType,
                p.image,
                p.review, 
                p.price
            };

foreach(var myProduct in stuff)

问题是,您正试图将匿名类型(由select new创建)强制转换为foreach中的tblmyWebsite。使用匿名类型时,var是您的朋友。

ArrayList数据结构是一个非泛型列表。它是在泛型概念之前引入的,与泛型List<T>相比,它没有任何好处,只是支持针对框架较低版本的程序集(兼容性):https://stackoverflow.com/a/2309699/347172


话虽如此,如果您只是在foreach语句中使用枚举,则不需要从枚举创建列表。Foreach使用IEnumerable/IEnumerable<T>接口,这就是LINQ语句返回的内容(IEnumerable<T>)。

foreach (var variable in LINQ-statement)
{
    // ...
}