簡體   English   中英

從 linq (linq2db) 中的另一個列表中排除一個列表

[英]exclude a list from another list in linq (linq2db)

我正在通過 linq2db 從數據庫中進行兩次提取。 我有兩個列表 TaskDone 和 TaskNotAccomplished。 我想擁有不在 TaskDone List 中的行

 taskDone = from t in db.tblTasks join a in db.tblTaskResult on t.TaskId equals a.TaskId 
            where 
            a.UserId == tUserId
            select new taskDone 
            {
                TaskId = t.TaskId.ToString(),
                Subject = t.Subject
            }).ToList());

 taskNotAccomplished= from t in db.tblTasks  where 
               t.IsActive == true 
               select new TaskNotAccomplished
               {
                   TaskId = t.TaskId .ToString(),
                   Subject= t.Subject,                                                                       
                   EndDate = t.DateTaskEnd,                                                                      
                   TaskTime= t.TaskTime,
               }).ToList());

如何不獲取 taskDone (TaskId) List 中的行?

您可以創建一個 taskDone Id 列表:

var taskDoneIdLst = (from x in taskDone select x.TaskId).ToList();

如果數據庫中的 TaskId 是 integer 列,您必須:

var taskDoneIdLst = (from x in taskDone select Convert.ToInt64(x.TaskId)).ToList();

然后在 taskNotAccomplished 查詢中按 (&&.taskDoneLst.Contains(t:TaskId)) 過濾它:

taskNotAccomplished= from t in db.tblTasks  where 
               t.IsActive == true 
              && !taskDoneLst.Contains(t.TaskId)
               select new TaskNotAccomplished
               {
                   TaskId = t.TaskId .ToString(),
                   Subject= t.Subject,                                                                       
                   EndDate = t.DateTaskEnd,                                                                      
                   TaskTime= t.TaskTime,
               }).ToList());

不確定我是否正確理解了問題,但如果您不將所有內容都放入列表中,您可以通過 LEFT JOIN 來做到這一點。

請注意,我已刪除TaskId.ToString()以避免表掃描:

var taskDoneQuery = 
    from t in db.tblTasks 
    join a in db.tblTaskResult on t.TaskId equals a.TaskId 
    where a.UserId == tUserId
    select new 
    {
        TaskId = t.TaskId,
        Subject = t.Subject
    };
            
var taskNotAccomplished = 
    from t in db.tblTasks 
    where t.IsActive == true 
    from td in taskDoneQuery.LeftJoin(td => td.TaskId == t.TaskId)
    where td == null
    select new TaskNotAccomplished
    {
        TaskId = t.TaskId.ToString(),
        Subject = t.Subject,                                                                       
        EndDate = t.DateTaskEnd,                                                                      
        TaskTime = t.TaskTime,
    };

您還可以加快查詢速度,因為無需兩次加入同一個表。

var taskNotAccomplished = 
    from t in db.tblTasks 
    where t.IsActive == true 
    from a in db.tblTaskResult.LeftJoin(a => a.TaskId == t.TaskId)
    where a == null
    select new TaskNotAccomplished
    {
        TaskId = t.TaskId.ToString(),
        Subject = t.Subject,                                                                       
        EndDate = t.DateTaskEnd,                                                                      
        TaskTime = t.TaskTime,
    };

暫無
暫無

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

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