仅查询一对多列表的id

时间:2012-03-17 04:51:39

标签: entity-framework-4 ef-code-first

我使用EF 4.3启用了延迟加载,从事ASP.NET MVC产品。

我有一个类产品,可以有零个或多个附件:

public class Product
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual long Id { get; set; }

    //... other properties

    public virtual List<Attachment> Pictures { get; set; }
}

public class Attachment
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual long Id { get; set; }

    [Required]
    public virtual byte[] Data { get; set; }
}

我的主页(HTML)将提供产品详细信息,包括附件列表。对于后者,我只需要附件的id,并且明确地不想加载Data属性(可能是大量数据)。

如何编写仅返回附件ID的查询,并且不会在数据库中查询附件的数据属性?

以下查询未成功;错误:无法创建“XXX.Model.Attachment”类型的常量值。在此上下文中仅支持原始类型(例如Int32,String和Guid')。

var query = from a in db.Attachments
  from prod in db.Product
  from pic in prod.Pictures
  where prod.Id == prodId && a.Id == pic.Id
  select a.Id;
query.ToList();

以下确实加载了附件的数据字段:

var product = db.Products.Find(prodId);
var pictureIds = product.Pictures.Select(x => x.Id).ToList();

1 个答案:

答案 0 :(得分:1)

试试这个:

var query = from prod in db.Product
            from pic in prod.Pictures
            where prod.Id == prodId
            select pic.Id;
query.ToList();

var query = db.Product
              .Where(p => p.Id == prodId)
              .SelectMany(p => p.Pictures)
              .Select(a => a.Id)
              .ToList();