0

您好我正在尝试将 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

其他所有领域也是如此 2

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

Console.WriteLine(produs);

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

我已经在 LINQPAD 上运行了这个测试,它在 Visual Studio 中也不起作用。我做错了什么?

4

3 回答 3

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);
}
于 2012-12-24T15:26:35.923 回答
2

采用

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

代替

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

其中 Product 是 Products 的单位

于 2012-12-24T15:28:08.620 回答
0

A ListofObject意味着您只能获得包含在object. 您应该执行以下操作:

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

就像注释一样,您还可以执行以下操作:

productList = products.ToList<Product>();

而不是遍历列表并添加每个元素。(Linq 隐含地为您执行此操作)。

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

于 2012-12-24T15:27:09.823 回答