从列表中的对象访问数据

时间:2012-12-24 15:24:21

标签: c# linq

您好我正在尝试将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中也不起作用。我做错了什么?

3 个答案:

答案 0 :(得分:6)

这是问题所在:

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

答案 1 :(得分:2)

使用

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

而不是

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

其中Product是产品的单位

答案 2 :(得分:0)

List Object表示您只获得object中包含的方法。你应该做点什么:

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

您也可以这样做:

productList = products.ToList<Product>();

而不是迭代列表并添加每个元素。 (Linq暗示地为你做了这件事)。

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