将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());
}
}
}
}
您在这里用匿名类型填充数组列表:
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)
{
// ...
}