我是asp.net的绝对初学者,我有一个相当复杂的问题,特别是我如何获得我刚刚从数据库中获得的数据。下面是我的查询和处理数据的开始。
var brandslist = from brand in brandDB.brands
join brand_family in brandDB.brand_family
on brand.brand_family_id equals brand_family.bf_id
orderby brand_family.brand_family_name,
brand.priority,
brand.genre_id
select new
{
brand_family.brand_family_name,
brand.priority,
brand.roll_image
};
var viewModel = new BrandIndexViewModel{
Brands = brandslist.ToList()
};
我习惯用PHP做事情,而不是asp,这就是为什么我完全被难住了。我确实有一个以前的数据库调用工作,但我只从数据库中获得一个东西,而这里我试图从数据库中获得多个项目。我想我的问题是我如何使数据访问到我的视图类?
感谢所有帮助我解决这个问题的人,因为我相信这是一个相当基本的问题。
编辑下面是我在编译时得到的错误信息:
错误1无法隐式转换类型"System.Collections.Generic"。列出' to 'System.Collections.Generic。目录C:InetpubwwwroothcdhcdControllersHomeController.cs 35 26 hcd
EDIT 2
只是为了确认我正在使用ASP MVC 2。
3编辑
这是我的品牌索引视图模型(但我已经看到了一个可能的问题)
public class BrandIndexViewModel
{
public List<string> Priority { get; set; }
public List<string> FamilyName { get; set; }
public List<string> RollImage { get; set; }
public List<string> Brands { get; set; }
}
你的问题的根源是你的LINQ查询返回一个匿名类型,但你分配给品牌,这是一个List<string>
。最终,你需要得到你想要的字符串。我将假设"brand_family_name"是您想要进入List<string> Brands
的数据。
var viewModel = new BrandIndexViewModel{
Brands = brandslist.Select(b => b.brand_family_name).ToList() // Or whichever property you want to use to populate List<string> Brands
};
正如在其他答案中提到的,您不指定您想要的ViewModel的Brands
列表(这将是最合乎逻辑的东西,如brand.Name
)。发布brand
和brand_family
类可以澄清这一点。
如果我理解正确,你基本上需要一个Brands
列表显示在你的视图。在这种情况下,将FamilyName
, Priority
, RollImage
和Brand
分组到一个对象中,并在ViewModel中列出它们:
public class BrandIndexViewModel
{
public List<BrandIndexItem> BrandIndexItems { get; set; }
}
public class BrandIndexItem
{
public string Priority { get; set; }
public string FamilyName { get; set; }
public string RollImage { get; set; }
public string Brand { get; set; }
}
在这种情况下,您不必为了填充每个列表而执行Select
。相反,您可以将查询结果直接投影到ViewModel上。下面是使用join的代码:
var viewModel = new BrandIndexViewModel
{
BrandIndexItems =
(from brand in brandDB.brands
join brand_family in brandDB.brand_family
on brand.brand_family_id equals brand_family.bf_id
orderby brand_family.brand_family_name,
brand.priority,
brand.genre_id
select new BrandIndexItem
{
FamilyName = brand_family.brand_family_name,
Priority = brand.priority,
RollImage = brand.roll_image,
Brands = brand.name // ?
}).ToList()
}
此外,您提到了使用数据库,但没有提到您是否正在使用ORM,如EF或LINQ-to-SQL。如果你正在使用其中一个,如果你能发布你的模型的截图,那将会很有帮助。同时,根据你的代码,看起来你在brand_family
和brand
之间有一对多的关系,所以如果你使用ORM,你可能有一个导航属性brand.brand_family
。在这种情况下,您将不需要在LINQ查询中使用join
:
var viewModel = new BrandIndexViewModel
{
BrandIndexItems =
(from brand in brandDB.brands
orderby brand.brand_family.brand_family_name,
brand.priority,
brand.genre_id
select new BrandIndexItem
{
FamilyName = brand.brand_family.brand_family_name,
Priority = brand.priority,
RollImage = brand.roll_image,
Brands = brand.name // ?
}).ToList()
}
我假设您使用的是ASP。净MVC。
要从视图中访问brandslist变量,请使用model参数从控制器中传入它。例如:
ActionResult ListAllBrands()
{
var brandslist = from brand in brandDB.brands
join brand_family in brandDB.brand_family
on brand.brand_family_id equals
brand_family.bf_id
orderby brand_family.brand_family_name,
brand.priority,
brand.genre_id
select new
{
brand_family.brand_family_name,
brand.priority,
brand.roll_image
};
return View("List", brandslist);
}
那么在你的视图中,将会有一个名为"Model"的变量,它将包含这个值。然后可以使用for/each循环遍历. aspx代码中的每条记录。