您好我正在尝试将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中也不起作用。我做错了什么?
答案 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,以便您可以将产品列表传递给其他方法等。