C# 实体框架-处理连接表中没有记录的连接

C# 实体框架-处理连接表中没有记录的连接,c#,sql,entity-framework,join,C#,Sql,Entity Framework,Join,我努力寻找答案,但我无法找到(或理解)解决方案。我有一个查询,其中我正在连接到另一个表,该表可能有关联记录,也可能没有关联记录。以下是查询: var educationUniversity = result.new_educationUniversity.Select(c => new { c.majorDegree, c.dateEnd, c.dateStart, c.institutionName, c.degreeProgramCompletionStat

我努力寻找答案,但我无法找到(或理解)解决方案。我有一个查询,其中我正在连接到另一个表,该表可能有关联记录,也可能没有关联记录。以下是查询:

  var educationUniversity = result.new_educationUniversity.Select(c => new 
    { c.majorDegree, c.dateEnd, c.dateStart, c.institutionName, 
      c.degreeProgramCompletionStatus, c.institutionAddress, 
      attachmentId = c.attachmentId ?? 0, 
      fileName = c.new_attachments.fileName ?? "No Attachment"}).ToList();
第一个表是“new_educationUniversity”,它包含用户学院或大学学位的详细信息。用户可能上载了附件(存储在“new_attachments”表中),也可能没有上载。attchmentID是“new_attachments”表中的主键,是“new_educationUniversity”表中的外键。EF看到了这种关系

我正在将结果绑定到一个转发器,但是如果没有相关附件,则代码在上面的一行失败。如果有附件或者我删除了对文件名的引用,一切都可以正常工作

上面,我正在处理文件名是否为NULL(或者至少我正在尝试),但我怀疑我的问题是该记录根本不存在,这与我猜想的NULL不同。我尝试过使用诸如:c.new_attachments.fileName.SingleOrDefault()或DefaultIfEmpty()之类的东西,但运气不好

作为类比,假设您有一个CUSTOMERS表和一个ORDERS表。您要查询以下内容:

-客户姓氏 -客户名 -客户最新订单Id


但是,您已经注册了从未购买过任何东西的客户。我确信我正在做一些完全不正常的事情,所以非常感谢任何帮助。谢谢

这里有几件事:

  • 您可以在对c.new_attachments.fileName的引用中获得空引用异常。如果new_attachments为null,则会引发异常。包含null合并操作符(the??)不会有帮助,因为您试图访问可以为null的内容的属性
  • 除非您是延迟加载(通常很糟糕),否则您没有理由尝试创建一个动态类型的对象来发送到中继器。直接传递结果。新教育大学对象
解决方案是什么? 我将创建一个分部类,以便将新属性添加到新的_educationUniversity类。添加空引用安全属性引用以确定new_educationUniversity的new_attachments属性的文件名。然后,将中继器绑定到新属性。比如:

public partial class new_educationUniversity {
    public String AttachmentFileName {
        get {
            if (new_attachments == null)
                return "";
            else
                return new_attachments.fileName;
        }
    }
}

下面的代码行似乎正在工作

 var educationUniversity = result.new_educationUniversity.Select
(c => new { c.majorDegree, c.dateEnd, c.dateStart, c.institutionName, 
c.degreeProgramCompletionStatus, c.institutionAddress, attachmentId = c.attachmentId ?? 0,
 fileName = (c.new_attachments == null ? "***NO ATTACHMENT***" : c.new_attachments.fileName)}).ToList();
我不完全理解这句话的意思:

fileName = (c.new_attachments == null ? "***NO ATTACHMENT***" : c.new_attachments.fileName)}
我假设它说“如果没有任何内容,用字符串“NO ATTACHMENT”替换,否则使用数据库中的内容”


这可以接受吗?到目前为止,一切顺利。谢谢

你所要求的是所谓的“左连接”,有大量的例子说明如何做到这一点,例如,或找到一种通过此链接工作的技术,尽管我不完全理解它。谢谢我不相信我正在使用惰性加载。当您通过名称遍历表层次结构时,我忘记了它在EF中的名称。如果EF知道my CUSTOMERS表和my ORDERS表在CUSTOMER_ID列上联接,那么在我获得订单var order=ORDERS.Where(c=>c.ID==3.Single()之后;我仍然可以通过order.customer.firstName获得客户的名字,这样做不好吗?我的SQL技能和需求都非常基本。谢谢如果在运行查询以检索订单后检索order.customer(以获取order.customer.firstName),则是延迟加载。如果您在初始查询中使用.Include()并急切地加载关联的客户对象,那么您就是急切地加载。假设您在某个时候确实需要客户,那么立即加载会更好。