我有一个类:
Public Class Task
{
Public Guid TaskId { get ; set }
Public Guid ParentId { get ; set }
...
}
另一类:
Public Class ContractDetail
{
Public Guid ContractDetailsID {get;set}
Public Guid TaskId { get;set}
...
}
我想检查是否所有任务都有ContractDetail,然后做一些事情,我写了这个查询:
List<Guid> Sids = new List<Guid>();
Sids = Tasks.Where(p => p.ParentId == ParentId).Select(p => p.TaskId).ToList();
if(ContractDetails.All(p => Sids.Contains(p.TaskId))
{
int i = 5;
.....
}
但它总是返回false。
如何检查所有任务是否具有ContractDetails?
bool allTasksHaveContractDetails = Tasks.All(t => ContractDetails.Any(cd => cd.TaskId == t.TaskId))
另一种方法:
var query =
from t in Tasks
join cd in ContractDetails on t.TaskId equals cd.TaskId into tmp
select tmp;
bool allTasksHaveContractDetails = query.All(x => x.Any());
尝试:而不是Contains
Sids.Any(s => s.Equals(p.SakhtarId))
并尝试通过确保此条件真的为true来调试它。
我不确定我是否完全了解您的使用场景,但假设您想检查每个Task
是否都有一个关联的ContractDetail
,即ContractDetail
和Task
具有相同的TaskId
,则可以从两个集合中选择唯一的ID并使用IEnumerable.SequenceEquals
,如下所示:
var tids = tasks.OrderBy(t => t.TaskId).Select(t => t.TaskId).Distinct();
var ctids = details.OrderBy(c => c.TaskId).Select(c => c.TaskId).Distinct();
if (tids.SequenceEqual(ctids))
{
Console.WriteLine("Every task has a contract");
}