从列表中的对象访问数据



嗨,我正试图将一个LINQ查询结果转换为对象列表,我似乎做错了什么,因为我无法访问每个对象的属性。下面是我的代码:

List<Object> productList = new List<Object>();
        var products = (from p in Products
                       join s in SubCategories on p.SubcatId equals s.SubCatId
                       join b in Brands on p.BrandId equals b.BrandId
                       select new
                                  {
                                      Subcategory = s.SubCatName,
                                      Brand = b.BrandName,
                                      p.ProductName,
                                      p.ProductPrice
                                  }).Where(x => x.Subcategory == subcategory);

        foreach (var product in products)
        {
            productList.Add(product);
        }
        foreach (var produs in productList){
            Console.WriteLine(produs.ProductName);
        }

当我尝试这样做时,我得到一个错误,说:

Object does not contain a definion for ProductName

对于所有其他字段也是如此

Aldo,如果我尝试这样做:

Console.WriteLine(produs);

我得到每个字段的数据表

我已经在LINQPAD上运行了这个测试,它也不能在visual studio中工作。我做错了什么?

这就是问题所在:

List<Object> productList = new List<Object>();

您将其声明为List<object>,这意味着当您稍后写这个时:

foreach (var produs in productList)

produs隐式类型为object

最简单的方法是使用ToList(),而不是自己将结果复制到列表中:

var products = (from p in Products
                join s in SubCategories.Where(x => x.SubCatName == subcategory)
                  on p.SubcatId equals s.SubCatId
                join b in Brands on p.BrandId equals b.BrandId
                select new {
                    Subcategory = s.SubCatName,
                    Brand = b.BrandName,
                    p.ProductName,
                    p.ProductPrice
                }).ToList();

注意,我已经尽可能早地移动了子类别名称过滤器—不需要在连接之后执行该操作。最后的ToList()调用将意味着结果是List<T>,其中T是您的匿名类型。

那么你可以使用:

foreach (var product in products)
{
    Console.WriteLine(produs.ProductName);
}

use

List<Product> productList = new List<Product>();

代替

List<Object> productList = new List<Object>();

其中Product是Products的单位

ObjectList意味着您只能获得object中包含的方法。你应该这样做:

List<Product> productList = new List<Product>();

你也可以这样做:

productList = products.ToList<Product>();

而不是遍历列表并添加每个元素。(Linq会隐式地为你做这件事)。

注意:这是假设您将查询选择更改为select new Product { ... }这将允许你使用List<Product> productList,这样你就可以将你的产品列表传递给其他方法等。

相关内容

  • 没有找到相关文章