LINQ初学者,表加入查询文档版本

时间:2013-04-10 16:49:11

标签: linq

我有一个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个全新的文件,它从文档表中正确显示信息。它正在编辑的文件显示文档表中的信息,但我需要修订表中的信息。如果项目存在于版本表中,是否可以返回版本表信息,如果版本表中不存​​在文档表信息(即全新的),则返回文档表信息。

希望我能正确解释。

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)。在该集合中,您可以过滤未批准的版本。

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

编辑#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
                            };