我有一个包含2个表的数据库:" Albumes"和"类别"。
每张专辑都有一个" id"和" categoryId"属性。虽然每个类别都有一个"名称"属性。
我可以通过QueryString从另一个页面获取Album.id,并在窗体视图中显示所需的相册详细信息。现在我想显示包含该专辑的类别的名称。
我尝试这样做:
public string GetCategoryName(int albumCategoryId)
{
var _db = new Trying.Models.AlbumContext();
IQueryable<Category> query = _db.Categories;
query = query.Where(c => c.id == albumCategoryId);
Category ca = new Category();
//some code
return ca.name;
}
我的问题出在&#34; //一些代码&#34;部分!在那里,我必须转换&#34; IQueryabl查询&#34;到&#34;类别ca&#34;。
怎么做?
答案 0 :(得分:1)
试试这个:
public string GetCategoryName(int albumCategoryId)
{
var _db = new Trying.Models.AlbumContext();
IQueryable<Category> query = _db.Categories;
Category ca = query.First(c => c.id == albumCategoryId);
return ca.name;
}
答案 1 :(得分:1)
Where
会返回一组所有匹配的实体,但您只需要一个实体。
public string GetCategoryName(Int32 albumCategoryId)
{
using (var _db = new Trying.Models.AlbumContext())
{
return _db.Categories.Single(c.id == albumCategoryId).Name;
}
}
如果没有匹配的类别,使用Single
将抛出异常,如果您确定该类别必须存在,则应使用此异常。如果您不确定该类别是否存在,如果没有匹配的类别,您可以使用SingleOrDefault
获取null
。 First
或FirstOrDefault
也会起作用,但它们在语义上是错误的,因为您不想要第一个类别,您只想要一个类别。 SingleOrDefault
显然需要处理没有匹配类别的情况。
public string GetCategoryName(Int32 albumCategoryId)
{
using (var _db = new Trying.Models.AlbumContext())
{
var category = _db.Categories.SingleOrDefault(c.id == albumCategoryId);
if (category != null)
{
return category.Name;
}
else
{
// Handle the no category found case by returning a default value,
// throwing an exception or what ever fits your needs.
}
}
}
另请注意,您应该在using
语句中使用数据库上下文,以确保即使出现错误也能及早处理并正确处理。
此外,您可以通过浏览导航属性直接访问该类别的名称。
var categoryName = album.Category.Name;
这显然仅在您拥有相册对象时才有用,并且您必须确保通过使用延迟加载来加载类别,或者如果您使用预先加载,则明确包含该类别。
var album = _db.Albumes.Include(a => a.Category)
.Single(a => a.Id = 42);
这会加载包含Id
42
的相册,因为Include(a => a.Category)
也会加载此相册的类别。这比明确查询类别名称更好还是更糟,当然取决于您的要求。
答案 2 :(得分:0)
我将用一些例子来解释,检查变量的类型,因为这就是每行将要返回的内容:
list<Category> list = query.Where(c => c.id == albumCategoryId).AsEnumerable();
Category category= query.FisrtOrDefault(c => c.id == albumCategoryId);
答案 3 :(得分:0)
IQueryable<T>
是一个集合。
您需要将收藏限制为单项。
query.Where
也会产生一个集合。我相信你正在寻找id的独特商品。我建议改为Single
:
var ca = query.Single(c => c.id == albumCategoryId);
return ca.name;