[英]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.