如何将IQueryable <category>转换为Category </category>

时间:2014-04-08 16:44:30

标签: c# iqueryable

我有一个包含2个表的数据库:&#34; Albumes&#34;和&#34;类别&#34;。

每张专辑都有一个&#34; id&#34;和&#34; categoryId&#34;属性。虽然每个类别都有一个&#34;名称&#34;属性。

我可以通过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;。

怎么做?

4 个答案:

答案 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获取nullFirstFirstOrDefault也会起作用,但它们在语义上是错误的,因为您不想要第一个类别,您只想要一个类别。 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;