【问题标题】:Customize DataGridView filled by linq-query自定义 linq-query 填充的 DataGridView
【发布时间】:2022-03-01 23:52:14
【问题描述】:

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

sql-tables

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

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

现在 datagridView1 由“deliveries”表中的列组成,但我不想显示列 customer_id 我想显示相应的客户名称和地址。

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

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 的形式并且是通过现有数据库中的代码优先创建的。

      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; }
    }

【问题讨论】:

  • 添加您的课程DeleiveryCustomer。显示您的映射。
  • 添加了上面的类。不确定映射是什么意思?
  • 我在这篇文章中分享了一些解决方案:Show Properties of a Navigation Property in DataGridView (Second Level Properties),包括:使用 DataGridViewComboBoxColumn,向实体添加属性,塑造 Linq 查询的结果,使用 CellFormatting,覆盖实体的 ToString,使用自定义类型描述符。它还为每个案例提供了一个示例和使用场景。
  • @RezaAghaei 是否支持嵌套的 displaymemberpath?
  • @RezaAghaei 谢谢,你的链接很好读。但我需要的只是下面接受的答案中提到的“选择”命令。

标签: c# winforms linq datagridview


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这行得通!我如何在单独的方法中使用它,因为返回的列表不再是 List&lt;deliveries&gt; 的形状?
猜你喜欢
  • 2015-01-12
  • 1970-01-01
  • 2016-09-30
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多