应该有一个简单的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”将无法工作,它需要找到具有最新日期的元素在列表中确定问题的状态。
答案 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()