从列表中的对象访问数据

Nis*_*dru 0 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);
        }
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时,我收到一条错误消息:

Object does not contain a definion for ProductName
Run Code Online (Sandbox Code Playgroud)

所有其他领域都是如此

阿尔多,如果我尝试这样做:

Console.WriteLine(produs);
Run Code Online (Sandbox Code Playgroud)

我得到了包含每个字段数据的表格

我已经为LINQPAD上的测试运行了它,它在visual studio中也不起作用.我做错了什么?

Jon*_*eet 6

这就是问题:

List<Object> productList = new List<Object>();
Run Code Online (Sandbox Code Playgroud)

你宣称它是一个List<object>,这意味着你以后写这个:

foreach (var produs in productList)
Run Code Online (Sandbox Code Playgroud)

然后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();
Run Code Online (Sandbox Code Playgroud)

请注意,我已尽早移动了子类别名称过滤器 - 在加入无需执行此操作.将ToList()在结束通话将意味着结果是一个List<T>地方T是你的匿名类型.

然后你可以使用:

foreach (var product in products)
{
    Console.WriteLine(produs.ProductName);
}
Run Code Online (Sandbox Code Playgroud)