LINQ查找所有子实体符合要求

时间:2015-04-16 18:49:56

标签: c# linq tsql

我有一个表Request和一个表Task。请求任务是一对多的关系。在请求中有一个状态。任务中也有状态。有时,人们会将所有“任务”状态标记为已完成,但不会将“请求”状态标记为已完成。我需要做一些维护工作。这是我的代码:

List<Request> RequestsNeedsAction = new List<Request>();
var requests = Requests.Where(r => r.RequestStatusID == 2 || 
                                   r.RequestStatusID == 6)
                       .ToList();

foreach (var request in requests)
{
    bool taskAllCompleted = true;
    foreach (var task in request.Tasks)
    {
        if (task.TaskStatusID != 2 && task.TaskStatusID != 5)
        {
            taskAllCompleted = false;
            break;
        }
    }
    if ( taskAllCompleted )
    {
        RequestsNeedsAction.Add( request );
    }   
}

RequestsNeedsAction.Dump();

在LINQ或tsql中有更简单的方法吗?

2 个答案:

答案 0 :(得分:4)

您可以尝试这样的事情:

var RequestsNeedsAction = Requests.Where(r => 
    (r.RequestStatusID == 2 || r.RequestStatusID == 6) 
    && !r.Tasks.Any( t => t.TaskStatusID != 2 && t.TaskStatusID != 5)).ToList();

答案 1 :(得分:2)

我认为这就是你要找的东西。您没有在问题中说,但是如果RequestStatusId为2或6,则我从代码中推断请求未完成,如果TaskStatusId为2或5,则任务完成。

List<Request> RequestsNeedsAction =
    Requests
    .Where(r => 
        (r.RequestStatusID == 2 || r.RequestStatusID == 6) && 
        r.Tasks.All(t => task.TaskStatusID == 2 || task.TaskStatusID == 5))
    .ToList();