Запрос только идентификаторов из списка «один ко многим» - PullRequest
0 голосов
/ 17 марта 2012

Я работаю над продуктом ASP.NET MVC, используя EF 4.3 с отложенной загрузкой.

У меня есть класс Product, который может иметь ноль или более вложений:

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) будет содержать сведения о продукте, включая список вложений.Для последнего мне требуется только идентификатор вложения, и я явно не хочу загружать свойство Data (которое может содержать много данных).

Как мне написать запрос, который будет возвращать толькоидентификаторы вложения, и не будет запрашивать базу данных для свойства данных вложения?

Запрос ниже не был успешным;ошибка: Невозможно создать постоянное значение типа '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 Ответ

1 голос
/ 17 марта 2012

Попробуйте это:

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(); 
...