自定义由linq-query填充的DataGridView

Customize DataGridView filled by linq-query

我有 2 个 SQL-表,我通过 SQL Server Managment Studio(包括 PK 和 FK)创建的:

sql-tables

在我 Visual Studio 的 WinForm 项目中,我通过 Code First 添加数据模型到现有数据库 并通过以下 linq 查询读取数据:

dataGridView1.DataSource = dbContext.deliveries.OrderBy(d => d.id).ToList();

现在 datagridView1 由 table“交付”中的列组成,但我不想显示列 customer_id,而是显示相应的列客户的姓名和地址。

Whosebug 上的一些其他答案建议编辑查询并使用“include”属性。所以我尝试使用

deliveries.Include(d=>d.customer.name).OrderBy(d => d.id).ToList();

但这会引发异常,而 运行 会出现以下错误:

The EntityType '*.customer' does not declare a navigation property with the name 'name'

我不明白,因为我的 类 遵循 https://docs.microsoft.com/en-us/ef/ef6/fundamentals/relationships 的形式并且是通过 Code First 从现有数据库.[=17= 创建的]

      public partial class deliveries
    {
        public int id { get; set; }

        public int? amount { get; set; }
        
        public int? customer_id { get; set; }
        [ForeignKey("customer_id")]
        public virtual customer customer { get; set; }

    }
   public partial class customer
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public customer()
        {
            deliveries = new HashSet<deliveries>();
        }
        [Key]
        public int customerID { get; set; }

        [StringLength(50)]
        public string name { get; set; }

        [StringLength(10)]
        public string address { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<deliveries> deliveries { get; set; }
    }

如果您只想显示特定值,则必须进行自定义投影并通过 Select 指定结果的形状。可以是DTO也可以是匿名的class,不需要Include。

var result = deliveries
    .OrderBy(d => d.id)
    .Select(d => new 
    {
        d.customer.name,
        d.customer.address
    })
    .ToList();