嗨,我正试图将一个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的单位
Object
的List
意味着您只能获得object
中包含的方法。你应该这样做:
List<Product> productList = new List<Product>();
你也可以这样做:
productList = products.ToList<Product>();
而不是遍历列表并添加每个元素。(Linq会隐式地为你做这件事)。
注意:这是假设您将查询选择更改为select new Product { ... }
这将允许你使用List<Product>
productList,这样你就可以将你的产品列表传递给其他方法等。