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

时间:2013-11-24 19:27:49

标签: c# sql entity-framework join

我大力搜索了这个答案,但我无法找到(或理解)一个解决方案。我有一个查询,我正在加入另一个可能有或没有相关记录的表。这是查询:

  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看到了这种关系。

我将结果绑定到转发器,但如果没有相关附件,则代码在上面的行中失败。如果有附件或者我删除了对fileName的引用,那么一切正常。

上面,我正在处理如果fileName为NULL(或者至少我正在尝试),但我怀疑我的问题是记录根本不存在,这与NULL不同我猜。我尝试过使用类似:c.new_attachments.fileName.SingleOrDefault()或DefaultIfEmpty()但没有运气。

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

-customer姓氏 - 顾客的名字 -customer最近的订单ID

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

2 个答案:

答案 0 :(得分:0)

所以你有一些事情在这里发生:

  • 您可以在对c.new_attachments.fileName的引用上获得空引用异常。如果new_attachments为null,则会抛出异常。包括null-coalescing运算符(??)将无济于事,因为您正试图访问可以为null的属性。
  • 除非你是懒惰加载(通常是坏的),否则你没有理由尝试创建一个动态类型的对象来发送到你的转发器。只需直接传递result.new_educationUniversity对象。

解决方案是什么? 我创建了一个部分类来为new_educationUniversity类添加一个新属性。添加null-reference-safe属性引用以确定new_educationUniversity的new_attachments属性的文件名。然后,将转发器绑定到您的新属性。类似的东西:

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

答案 1 :(得分:0)

以下代码行似乎正在运作。

 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“否则使用DB中的内容”

这可以接受吗?到现在为止还挺好。谢谢!