簡體   English   中英

根據特殊條件分組的 Linq 查詢

[英]Linq query to group by based on special condition

我的表是:

id | globalId | taskStatus |
1  | 10       | New        | 
2  | 11       | New        |
3  | 10       | InProgress |
4  | 12       | New        |

我想要一個 linq 查詢,它返回第 2 行的結果。

簽入查詢的條件

  1. 想要忽略那些具有相同 globalId 的記錄,並且任何記錄的任務狀態是否為 InProgress。 因此,在這種情況下,因為 1、3 的記錄具有相同的全局 ID 10,但 ID 為 3 的記錄的任務狀態是 InProgress,所以不需要這兩條記錄中的任何一條。
  2. 還要檢查條件 ID < 4

我試過下面的查詢

  var result = (from meetings in db.Meetings
                      join taskStatus in db.TaskStatus on meeting.TaskStatusId equals taskStatus.TaskStatusId
                      where (taskStatus.Name == InternalTaskStatus.New || taskStatus.Name == InternalTaskStatus.ToBePlannedInFuture || taskStatus.Name == InternalTaskStatus.Failed)
                      && meeting.CalendarEvent != CalendarEvents.Delete
                      && meeting.StartDateTime >= planningPeriodStartDate && meeting.EndDateTime <= planningPeriodEndDate
                      group meeting by meeting.GlobalAppointmentId  into m
                      select new
                      {
                          MeetingResult = m.FirstOrDefault()
                      }).FirstOrDefault();

在上面的查詢中,我添加了任務狀態檢查,只需要帶有 taskStatus-New、Failed、ToBePlannedInFuture 的記錄。 但是在這里我得到了錯誤的結果,根據上表,我得到的結果是 id 1。

解決這個問題的理想方法是拆分需求。

要求 1:忽略 id < 4 的項目

var step1 = testList.Where(x=>x.id<4);

在此處輸入圖片說明

要求2:忽略具有相同globalId的項目組相同,並且組中的任何元素都沒有“InProgress”狀態

var step2 = step1.GroupBy(x=>x.globalId)
            .Where(x=>!x.Any(c=>c.taskStatus.Equals("InProgress")));

在此處輸入圖片說明

現在您需要將組展平以獲得結果為 IEnumerable

var step3= step2.SelectMany(x=>x);

在此處輸入圖片說明

把這一切放在一起

var result = testList.Where(x=>x.id<4).GroupBy(x=>x.globalId)
            .Where(x=>!x.Any(c=>c.taskStatus.Equals("InProgress")))
            .SelectMany(x=>x);
public class test
    {
        public int id { get; set; }
        public int globalId { get; set; }
        public string taskStatus { get; set; }
    }

    public void SampleName()
    {
        List<test> testList = new List<test>()
        {
            new test() { id = 1, globalId =  10, taskStatus =  "New"},
            new test() { id = 2 , globalId = 11 , taskStatus = "New"},
            new test() { id = 3 , globalId = 10 , taskStatus = "InProgress"},
            new test() { id = 4 , globalId = 12 , taskStatus = "New"}
        };

        var result = testList.Where(q => testList.Count(a => a.globalId == q.globalId) == 1 && q.taskStatus != "InProgress" && q.id < 4).ToList();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM