0

我有一张Document桌子和一张Version桌子。两者都有相同的信息。每当创建一个文档时,它就会被插入到文档表中。每当编辑该文档时,就会在版本表中添加一行。

它有一个字段 dateApproved ,null直到它被批准。我目前正在处理 MVC 4 Approval 页面,我之前从未接触过 linq,它需要在 linq 中完成。

如何加入这两个表 Document/Version 并仅显示 dateApproved 所在的项目null

from v in Versions
select v

from v in Document
select v

编辑#1

用户添加一个全新的文档,然后将该文档添加到文档表中。此时,文件需要批准。Documents 表中的 dateApproved 字段为空。假设该文档获得批准,然后用户进行更改,并且由于该文档已经存在,因此将一行添加到 Versions 表中。现在,该文档存在于两个表中,原始文档的修订版 0 和 dateApproved,而 Versions 表的修订版 1 的 dateApproved 为空。

我需要的是 dateApproved 为 null 的文档,这个 null 在 Documents 表或 Versions 表中。批准后,我们​​保留 Version 表中的行,并使用批准的版本更新 Documents 表中的行。

键主键是 DocumentID。

编辑#2

感谢 Peter Kiss,它现在显示所有需要批准的文件。我又遇到了一个小问题。它返回 3 个正确的结果。2 个文件是全新的,1 个已被编辑。

2个全新的文件正确显示文档表中的信息。编辑后的文件显示文档表中的信息,但我需要修订表中的信息。是否可以让它在版本表中存在时返回版本表信息,在版本表中不存​​在时返回文档表信息(即全新)。

希望我解释得当。

4

2 回答 2

1

仅选择具有dateApproved为空的记录。并将其收集在某种列表中listofVersions

var listofVersions=(from v in Versions 
         where v.dateApproved==null
         select v).ToList();

您可以对Document. 只需替换VersionDocument. 注意:我只是收集它var以使其简单。您可以根据需要创建一个列表Versions/Document

于 2013-04-10T17:00:04.993 回答
1
var documents = 
    ctx.Documents
         .Where(x => x.dateApproved == null 
                     || x.Versions.Any
                           (y => y.dateApproved == null));

文档变量将仅包含那些具有未经批准版本的文档。然后,当您遍历此集合时,当前文档可以通过名为 Versions 的导航属性访问它的 Versions(全部)。在该集合中,您可以过滤未批准的版本。

所有这一切只有在您的上下文中正确设置映射(又名外键)时才会发生。

编辑 #2 后

class DocumentToApprove
{
    public string Name { get; set; }
    /* other stuff */
    public int version { get; set; }
}

var documents = ctx.Documents
          .Where(x => x.dateApproved == null 
                      || x.Versions.Any(y => y.dateApproved == null));

var toApprove = from d in documents
            let v = d.Versions.FirstOrDefault(y => y.Approved == null)
        select new DocumentToApprove
                   {    Name = d.Name
                                ,
                                /* other stuff */
                                Version = v == null ? 1 : v.VersionNumber
                            };
于 2013-04-10T17:06:41.523 回答