Выберите «Включить», если загрузка связанных данных в EF6 не работает - PullRequest
0 голосов
/ 03 марта 2020

У меня есть вопрос по EF 6. У меня есть следующий оператор внутри моего класса модели данных, который использует для выборки все счета-фактуры, а также связанные с ними данные (PurchaseItems, Customer и CustomerAddress).

public List<Invoice> GetAllInvoice()
    {
        using (var context = new InvoiceSolutionContext())
        {
           return context.Invoices.Include(p => p.PurchaseItems).Include(c => c.Customer.Select(ca => ca.CustomerAddress)).ToList();

        }
    }

Вышеуказанный метод имеет следующие операторы using в классе.
using Invoicing.DomainModel;
с использованием System.Collections.Generic;
с использованием System.Data.Entity;
с использованием System.Linq;

Но проблема в том, что выбор (ca => ca. CustomerAddress) не работает и выдает мне следующую ошибку компиляции.

«Customer» не содержит определения «Select» и отсутствует доступный метод расширения «Select», принимающий первый аргумент типа «Customer» 'может быть найдено (вам не хватает директивы using или ссылки на сборку?)

Ниже приведены мои классы, связанные с вышеуказанной проблемой.

 public class Invoice 
{      
    [Key]
    public int ID { get; set; }        

    [Required]
    [Column("invoiceNumber")]
    [Display(Name = "Invoice Number")]
    public string InvoiceNumber { get; set; }       

    [Required]
    [Column("description")]
    public string Description { get; set; }

    [Required]
    public List<PurchaseItem> PurchaseItems { get; set; }

    [Required]
    [Column("totalCost")]
    [Display(Name = "Total Cost")]
    public decimal TotalCost { get; set; }

    [Required]
    [Column("taxTotal")]
    [Display(Name = "Tax Amount")]
    public decimal TaxAmount { get; set; }

    [Column("otherCost")]
    [Display(Name = "Other Cost")]
    public decimal OtherCost { get; set; }

    [Required]
    [Column("subTotal")]
    [Display(Name = "Sub Total")]
    public decimal SubTotal { get; set; }


    #region Foreign Key Ref

    [Column("customerID")]
    public int CustomerID { get; set; }       

    public Customer Customer { get; set; }

    [Column("accountID")]
    public int AccountID { get; set; }

    public Account Account { get; set; }

    #endregion

    [Column("dateCreated")]
    public DateTime DateCreated { get; set; }

    [Column("dateModified")]
    public DateTime DateModified { get; set; }

    [Column("status")]
    public bool Status { get; set; }
}

public class PurchaseItem 
{
    [Key]
    public int ID { get; set; }

    [Required]
    [Column("description")]
    public string Description { get; set; }

    [Required]
    [Column("unitPrice")]
    [Display(Name = "Unit Price")]
    public decimal UnitPrice { get; set; }

    [Required]
    [Column("quantity")]
    public int Quantity { get; set; }

    [Required]
    [Column("amount")]
    public decimal Amount { get; set; }

    //foreign key reference
    [Column("invoiceID")]
    public int InvoiceID { get; set; }

    public Invoice Invoice { get; set; }

}

    public class Customer
{    
    [Key]
    public int ID { get; set; }     

    [Required]
    [Column("firstName")]
    [MaxLength(250, ErrorMessage ="First name must have 250 characters or less")]
    [Display(Name ="First Name")]
    public string FirstName { get; set; }        

    [Required]
    [Column("lastName")]
    [MaxLength(250, ErrorMessage ="Last name must have 250 characters or less")]
    [Display(Name ="Last Name")]
    public string LastName { get; set; }

    [Required]
    [Column("emailAddress")]
    [MaxLength(255, ErrorMessage ="Email address must have 255 characters or less")]
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email Address")] 
    public string EmailAddress { get; set; }

    [Required]
    [Column("contactNumber")]
    [Display(Name ="Contact Number")]
    public string ContactNumber { get; set; }

    [Column("abn")]
    public string ABN { get; set; }

    [Column("dateCreated")]
    public DateTime DateCreated { get; set; }

    [Column("dateModified")]
    public DateTime DateModified { get; set; }

    [Column("status")]
    public bool Status { get; set; }

    public List<Invoice> Invoices { get; set; }

    public CustomerAddress CustomerAddress { get; set; }

}

public class CustomerAddress
{
    [Key, ForeignKey("Customer")]
    public int ID { get; set; }       

    [Required]
    [Column("buildingNumber")]
    [MaxLength(255, ErrorMessage ="Building number must have 255 characters or less")]
    [Display(Name ="Building Number")]
    public string BuildingNumber { get; set; }      

    [Required]
    [Column("streetName")]
    [MaxLength(255, ErrorMessage ="Street name must have 255 characters or less")]
    [Display(Name ="Street Name")]
    public string StreetName { get; set; }        

    [Required]
    [Column("suburb")]
    [MaxLength(255, ErrorMessage ="Suburb must have 255 characters or less")]
    public string Suburb { get; set; }      

    [Required]
    [Column("state")]
    public string State { get; set; }        

    [Column("postCode")]
    [Display(Name ="Postcode")]
    public int PostCode { get; set; }

    public Customer Customer { get; set; }

}

Может кто-нибудь сказать мне, в чем здесь проблема, пожалуйста? Оцените вашу помощь в этом

РЕДАКТИРОВАТЬ: Ниже приведена диаграмма класса Class Diagram

1 Ответ

1 голос
/ 03 марта 2020

Select - это выражение Linq для коллекций. Клиент является единственным лицом. Вам нужно использовать Include для нескольких уровней, чтобы их загружать:

return context.Invoices
    .Include(p => p.PurchaseItems)
    .Include(c => c.Customer.CustomerAddress)
    .ToList();

При обращении к ссылкам под коллекциями вы можете загрузить их по имени. Например, если в PurchaseItem есть Product:

return context.Invoices
    .Include(p => p.PurchaseItems)
    .Include("PurchaseItems.Product") // Loads product under each Purchase Item
    .Include(c => c.Customer.CustomerAddress)
    .ToList();

Я считаю, что это также можно сделать с помощью Select:

    .Include(p => p.PurchaseItems.Select(pi => pi.Product))

Это будет работать для PurchaseItem, потому что это коллекция, где -Как клиент был единственной ссылкой.

...