繁体   English   中英

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

[英]Entity Framework - Handling a join with no records from join table

我一直在努力寻找答案,但是找不到(或理解)解决方案。 我有一个查询,我要联接到另一个可能有关联记录的表。 这是查询:

  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表。 您要查询以下内容:

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

但是,您已经注册了从未购买任何产品的客户。 我确定我所做的事情完全毫无意义,因此,我们非常感谢您的协助。 谢谢!

因此,您在这里发生了一些事情:

  • 您对c.new_attachments.fileName的引用会出现空引用异常。 如果new_attachments为null,则将引发异常。 包括null运算符(??)不会有帮助,因为您正在尝试访问可以为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;
        }
    }
}

以下代码行似乎有效。

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

我认为它说:“如果无所不有与字符串替换‘没有附件’,否则用的是在DB”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM