【问题标题】:尝试在 C# 中使用 LINQ 填充组合框但没有得到任何结果
【发布时间】:2022-01-21 06:17:05
【问题描述】:

我正在尝试使用以下对象、实体框架和 LINQ 从数据库中填充本地办公室联系人姓名列表的组合框。它不返回任何结果。有人可以帮忙吗? 这些类看起来像这样。

public class OfficeContact
{
     [Key]
     public int OfficeContactId { get; set; }

     public string Name { get; set; }

     public string Email { get; set; }

     public string Phone { get; set; }

}

public class Office
{
     [Key]
     public int OfficeId { get; set; }

     public string Region { get; set; }

     public string Address { get; set; }

     public string City { get; set; }
        
     [Display(Name = "OfficeContact")]
     public virtual int OfficeContactId { get; set; }

     [ForeignKey("OfficeContactId")]
     public virtual OfficeContact OfficeContacts { get; set; }
}

LINQ 如下所示。

private void cbAddress_SelectionChangeCommitted(object sender, EventArgs e)
{
     var localContact = from office in context.Offices.ToList()
                        where office.OfficeContacts.Equals(office.OfficeContactId)
                        select Name;

     cbLocalOfficeContactName.DataSource = localContact.ToList();
}

【问题讨论】:

    标签: c# entity-framework linq


    【解决方案1】:

    首先,从in context.Offices 中删除.ToList()。此处的 ToList() 将导致 EF 在应用 Where 子句之前从数据库加载 所有 办公室。

    接下来,下面的 Where 子句没有任何意义:

    where office.OfficeContacts.Equals(office.OfficeContactId)
    

    这更像是Join 子句,而不是Where 条件。使用导航属性设置 EF 时,相关实体之间的连接完全在幕后处理。

    如果您想为每个办公室选择办公室联系人姓名,您只需Select 来自相关实体的姓名。然后您可以在加载之前使用ToList()获取数据:

     var localContacts = (from office in context.Offices
                        select office.OfficeContacts.Name).ToList();
    

    Where 子句是您只希望来自特定办公室的符合条件的联系人。例如,如果您只想要特定区域中办公室的联系人姓名:

     var localContacts = (from office in context.Offices
                        where office.Region = localRegion
                        select office.OfficeContacts.Name).ToList();
    

    其中localRegion 是传入或计算的值,以限制您的办公室选择。

    从那里你可以在这里放一个断点,让它执行,看看你是否得到任何 localContacts。如果您没有看到任何数据,那么最常见的罪魁祸首是 DbContext 在运行时使用的连接字符串与您预期的不同,并且它没有您希望它找到的数据。仔细检查 web.config 或 .exe.config 文件中的连接字符串。导致此问题的常见原因是将 DbContext 和实体移动到不同的程序集并更新 DLL 的 app.config 中的连接字符串,其中它不反映仍在主应用程序配置中的设置。

    【讨论】:

    • 您能否告诉我如何将例如 OfficeContacts.Email 转换为字符串,以便我可以使用该值填充文本框?我已经尝试过 ToString() 方法。
    • 从您的架构中,电子邮件是一个字符串,因此您应该能够将其链接到文本框而无需任何转换。您的下拉列表中只显示了名称,也许可以通过一个示例来扩展问题,说明您正在做什么来阅读电子邮件以及您如何尝试显示它。
    【解决方案2】:

    试试这个

    
         var localContacts = context.Offices
                            .Select(o=>o.OfficeContacts.Name)
                            .ToList();
         cbLocalOfficeContactName.DataSource = localContacts;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多