我有一个Document
表和一个Version
表。两者都有相同的信息。每当创建文档时,它都会插入到文档表中。每当编辑该文档时,就会在“版本”表中添加一行。
它有一个字段dateAroved,在获得批准之前将为null
。我目前正在开发一个MVC 4 Approval页面,我以前从未接触到linq,它需要在linq中完成。
如何加入这两个表格文档/版本,并且只显示dateApproved为null
的项目?
from v in Versions
select v
from v in Document
select v
编辑#1
用户添加一个全新的文档,然后将该文档添加到文档表中。此时文档需要批准。 Documents表中的dateApproved字段为null。让我们说这个文档得到批准,然后用户进行更改,因为这个文档已经存在,所以在Versions表中添加了一行。现在,这个文档在两个表中都存在具有dateApproved的版本0的原始文档,而Versions表的版本1具有dateApproved为null的版本。
我需要的是dateApproved为null的文档,这个null是在Documents表或Versions表中。批准后,我们将该行留在Version表中,并使用批准的版本更新Documents表中的行。
密钥主键是DocumentID。
编辑#2
感谢Peter Kiss,它现在显示了所有需要批准的文件。我遇到了另外一个打嗝。它返回3个结果是正确的。 2个文件是全新的,1个已被编辑。
2个全新的文件,它从文档表中正确显示信息。它正在编辑的文件显示文档表中的信息,但我需要修订表中的信息。如果项目存在于版本表中,是否可以返回版本表信息,如果版本表中不存在文档表信息(即全新的),则返回文档表信息。
希望我能正确解释。
答案 0 :(得分:1)
仅选择dateApproved
为空的记录。并以某种列表listofVersions
收集它。
var listofVersions=(from v in Versions
where v.dateApproved==null
select v).ToList();
您可以对Document
执行相同的操作。只需将Version
替换为Document
即可。
注意:我只是使用var
收集它以简化它。如果您愿意,可以创建Versions/Document
列表。
答案 1 :(得分:1)
var documents =
ctx.Documents
.Where(x => x.dateApproved == null
|| x.Versions.Any
(y => y.dateApproved == null));
文档变量将仅包含具有未批准版本的文档。然后,当您遍历此集合时,当前文档可以通过名为Versions的导航属性访问它的Versions(all)。在该集合中,您可以过滤未批准的版本。
只有在您的上下文中正确设置映射(即外键)时才会发生这一切。
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
};