帮我构建一下这个Linq语句

时间:2010-04-15 16:05:17

标签: c# linq

应该有一个简单的Linq查询我想要完成的事情,但我正在制作一些丑陋的代码。

我有两个表,一个是问题,另一个是问题状态。问题和问题状态之间存在一对多的关系。创建问题时,还会创建一个IssueStatus,并在关闭时将状态字段设置为“打开”,创建另一个IssueStatus,并将状态字段设置为“已关闭”...但可以重新打开问题。看起来我应该能写出这样的东西:

    public static List<Issue> FindOpenIssues(this IList<Issue> issues) {
        return (
            from issue in issues
            from issueStatus in issue.issueStatus.OrderByDescending(x=>x.CreatedOn).Single() 
            where issueStatus.Status == "Open"
            select issue
            ).ToList();
    }

这显然失败了,但必须有一个干净的方法来做到这一点?谢谢!

编辑:正如里德·科普西指出的那样,我的目的是找到当前未解决的问题。一个问题可能包含一个元素“Open”,并在以后的日期,一个元素“Closed”...这就是为什么一个简单的Where ==“Open”将无法工作,它需要找到具有最新日期的元素在列表中确定问题的状态。

3 个答案:

答案 0 :(得分:2)

看起来您正在尝试查找状态为“打开”的问题。如果是这样,这应该有效:

public static List<Issue> FindOpenIssues(this IList<Issue> issues) {
    return issues
              .Where(i => i.issueStatus.Any(stat => stat.Status == "Open")
              .ToList();
}

这与您的原始版本不同,但根据方法名称,我认为实际上可能会提供预期的结果(任何存在Open状态的问题)。

你可以像原来那样做你原来的回复:

public static List<Issue> FindOpenIssues(this IList<Issue> issues) {
    return issues
            .Where(i => i.issueStatus
                             // This potentially should be (I left your original logic, though):
                             // .OrderByDescending(stat => stat.CreatedOn)
                             .OrderBy(stat => stat.CreatedOn)
                             .First()
                             .Status == "Open"
                  )
            .ToList();
}

答案 1 :(得分:1)

假设您保留每个问题的问题状态历史记录,您可以选择所有问题,其中最新的问题状态(即按创建日期降序排序的第一个问题状态)是“打开”使用此项:

return issues.Where(issue => issue.issueStatus
                                  .OrderByDescending(x => x.CreatedOn)
                                  .First()
                                  .Status == "Open")
             .ToList();

答案 2 :(得分:0)

issues.Where(issue=>issue.issueStatus
 .Where(issueStat=>issueStat.Status==Open)
 .OrderBy(x=>x.createdOn).Single()).ToList()