C# 帮助我构造这个Linq语句

C# 帮助我构造这个Linq语句,c#,linq,C#,Linq,应该有一个简单的Linq查询来完成我试图完成的任务,但是我产生了一些丑陋的代码 我有两个表格,一个是问题,另一个是问题状态。问题和问题状态之间存在一对多关系。当一个问题被创建时,一个问题状态栏也被创建,当它被关闭时,状态栏被设置为“打开”,另一个问题状态栏被创建,状态栏被设置为“关闭”。。。但问题可以重新打开。看来我应该能写这样的东西: public static List<Issue> FindOpenIssues(this IList<Issue> issue

应该有一个简单的Linq查询来完成我试图完成的任务,但是我产生了一些丑陋的代码

我有两个表格,一个是问题,另一个是问题状态。问题和问题状态之间存在一对多关系。当一个问题被创建时,一个问题状态栏也被创建,当它被关闭时,状态栏被设置为“打开”,另一个问题状态栏被创建,状态栏被设置为“关闭”。。。但问题可以重新打开。看来我应该能写这样的东西:

    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();
    }
公共静态列表FindOpenIssues(此IList问题){
返回(
从一个问题到另一个问题
从issue.issueStatus.OrderByDescending(x=>x.CreatedOn.Single()中的issueStatus开始
其中issueStatus.Status==“打开”
选择问题
).ToList();
}
这显然是失败的,但必须有一个干净的方法来做到这一点?谢谢


编辑:正如里德·科佩所指出的,我的目的是寻找当前尚未解决的问题。一个问题可能包含一个“打开”元素,而在以后的某个日期,可能包含一个“关闭”元素。。。这就是为什么一个简单的Where==“Open”不起作用,它需要在列表中找到具有最新日期的元素来确定问题的状态。

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

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

假设您保存每个问题的问题状态历史记录,您可以使用以下方法选择最新问题状态(即按创建日期向下排序的第一个问题状态)为“打开”的所有问题:

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

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

public static List<Issue> FindOpenIssues(this IList<Issue> issues) {
    return issues
              .Where(i => i.issueStatus.Any(stat => stat.Status == "Open")
              .ToList();
}
公共静态列表FindOpenIssues(此IList问题){
退货问题
.Where(i=>i.issueStatus.Any(stat=>stat.Status==“打开”)
.ToList();
}
这与您原来的不同,但基于方法名称,我相信实际上可能会提供预期的结果(存在打开状态的任何问题)

您可以这样做,您的原始文件将返回:

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();
}
公共静态列表FindOpenIssues(此IList问题){
退货问题
.其中(i=>i.issueStatus
//这可能应该是(尽管我保留了您的原始逻辑):
//.OrderByDescending(stat=>stat.CreatedOn)
.OrderBy(stat=>stat.CreatedOn)
.First()
.Status==“打开”
)
.ToList();
}

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

public static List<Issue> FindOpenIssues(this IList<Issue> issues) {
    return issues
              .Where(i => i.issueStatus.Any(stat => stat.Status == "Open")
              .ToList();
}
公共静态列表FindOpenIssues(此IList问题){
退货问题
.Where(i=>i.issueStatus.Any(stat=>stat.Status==“打开”)
.ToList();
}
这与您原来的不同,但基于方法名称,我相信实际上可能会提供预期的结果(存在打开状态的任何问题)

您可以这样做,您的原始文件将返回:

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();
}
公共静态列表FindOpenIssues(此IList问题){
退货问题
.其中(i=>i.issueStatus
//这可能应该是(尽管我保留了您的原始逻辑):
//.OrderByDescending(stat=>stat.CreatedOn)
.OrderBy(stat=>stat.CreatedOn)
.First()
.Status==“打开”
)
.ToList();
}

这是不同的-它是issueStatus.Status==“Open”,而不仅仅是issueStatus实例…您需要在
.First()之后添加
.Status
,这是不同的-它是issueStatus.Status==“Open”,而不仅仅是issueStatus实例…您需要在
.First()之后添加
.Status
不是每个问题都至少一次打开吗?所以这会选择所有问题,对吗?dtb:如果问题在完成后被标记为关闭,则不会。虽然我确实重写了以提供原始行为…谢谢,效果很好!只是针对我的项目进行了测试。您是正确的OrderBy应该是OrderByDescending。很有意思的是,LINQ本身几乎和封装它的扩展方法一样具有声明性。不是每个问题都至少一次打开吗?所以这会选择所有问题,对吗?dtb:如果问题在完成后被标记为关闭,则不会。虽然我确实重写了以提供原始行为…谢谢,按很好!刚刚在我的项目中测试了它。你是对的OrderBy应该是OrderByDescending。有趣的是,看看LINQ本身是如何像封装它的扩展方法一样声明的。